| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
LeoSimanca
Registrado: 15 Abr 2011 Mensajes: 20
| Publicado: 11/05/2011 3:27 pm | | | Título: Torres de Hanoi (Solucion iterativa y recursiva) |
| Alguien me puede explicar como funciona este programa por favor!
| Código: | #include <stdio.h> #include <stdlib.h> int main() { int n, x; printf( "How many disks? " ); scanf( "%d", &n ); printf("\n"); for (x=1; x < (1 << n); x++) printf( "move from tower %i to tower %i.\n", (x&x-1)%3, ((x|x-1)+1)%3 ); system( "PAUSE"); return 0; } |
|
| | Volver arriba | |  | LeoSimanca
Registrado: 15 Abr 2011 Mensajes: 20
| Publicado: 11/05/2011 3:28 pm | | | Título: |
| | Es el de las torres de hanoi pero de forma iterativa, sin embargo no entiendo bien como funciona el for! |
| | Volver arriba | |  | untio

Registrado: 17 Sep 2008 Mensajes: 380 Ubicación: MICA S.A.
| Publicado: 12/05/2011 8:52 am | | | Título: |
| Hola, Todo es cuestión de entender las operaciones que trabajan con bits: 1 << 1; Te convertirá 00000001 a 00000010 Ha desplazado una vez hacia la izquierda los bits. Por la izquierda se pierden y se rellena con ceros. En assembly se suele usar para multiplicar por potencias de 2. 1 << 2; Te convertirá 00000001 a 00000100 1 << 4; El 1 que es el valor original se transformará en: 00010000 (se ha desplazado 4 veces). 1 & 1 Es un and bit a bit: Si los 2 son 1 entonces 1 si no 0: 00000010 & 00000111 dará: 00000010 1 | 1 Es un or bit a bit: Si alguno de los 2 o los 2 es 1 entonces 1, si los 2 son cero entonces 0: 01010111 | 11000010 dará 11010111. 3 % 2 Dará 1. Es el resto de la división entera: 5 % 2 = 1. 5 % 3 = 2;
Espero que te aclare algo. |
| | Volver arriba | |  | | manuel_venezuela
Registrado: 02 Mar 2011 Mensajes: 41 Ubicación: venezuela
| Publicado: 09/06/2011 9:19 pm | | | Título: Re: Urgente! |
| buenas yo tengo 1 version de las torres de hanoi en forma iterativa, pero con 1 disco , 2 o 3 disco , no consigo generalizarlo para n discos,...., por supuesto el metodo recursivo es clasico y se consegui facil....te lo anexo en el otro , el programa iterativo consta de 1 archivo llamado power.h , que es una libreria q arroja todos los resultados de los 2^n -1 movimientos de las torres de hanoi,...y el otro es hanoi_iterativa.c.,..... --------------------------------------------------------------
| Código: | archivo ------power.h---- #include<stdio.h> int power(int,int); /*main() { int x=2,y;
printf("base\n"); scanf("%d",&x); printf("exponente:entero mayor o igual a 1\n"); scanf("%d",&y);
printf("power(%d,%d):%d\n",x,y,power(2,y)); }*/
int power(int base,int exponente) {
if(exponente==1) return base; else return base*power(base,exponente-1);
}
|
-----------------------------------------------------------------
| Código: | --------------------------hanoi_iterativo.c------------------
#include<stdio.h> #include "power.h"
main() { int i; int z; int n; int x=2; int y=0; int aux=0; int movimiento=0; int origen=1,auxiliar=2,destino=3; int disco; int disco1=1,disco2=2; int disco3=1,disco4=3; printf("numeros de discos\n"); scanf("%d",&n); y=(power(x,n)); //printf("%d",y); if(n%2==1){ for(i=y-1;i>=1;i--) { aux=i%=y; movimiento=(y-aux);
if(n%2==1 && movimiento==1) { disco=destino; printf("mueve el disco de la estaca %d a la estaca %d\n",movimiento,disco); } else if(n==1 || movimiento%2==1) { //printf("%d\n",disco); printf("mueve el disco de la estaca %d a la estaca %d \n",disco,auxiliar); disco=auxiliar; auxiliar=origen; origen=destino; }
else if(n>1 || movimiento%2==0 ) { printf("mueve el disco de la estaca %d a la estaca %d \n",disco1,disco2); disco1=origen-auxiliar; disco2=destino; disco1=disco2-auxiliar; } } }
if(n%2==0) { for(i=y-1;i>=1;i--) { aux=i%=y; movimiento=(y-aux);
if(n%2==0 && movimiento==1) { disco=auxiliar; printf("mueve el disco de la estaca %d a la estaca %d\n",movimiento,disco); } else if(n==1 || movimiento%2==1) { //printf("%d\n",disco); //for(i=n-1;i>1;i--) { printf("mueve el disco de la estaca %d a la estaca %d \n",disco,destino); disco=destino; auxiliar=origen; destino=auxiliar; } else if(n>1 || movimiento%2==0 ) { printf("mueve el disco de la estaca %d a la estaca %d \n",disco3,disco4); disco3=origen-auxiliar; disco4=destino; disco3=disco4-auxiliar; }
} } }
|
|
| | Volver arriba | |  | manuel_venezuela
Registrado: 02 Mar 2011 Mensajes: 41 Ubicación: venezuela
| Publicado: 09/06/2011 9:23 pm | | | Título: Re: Urgente! |
| y por supuesto la version iterativa es casi un clasico de la programacion...
ahi te va para ayudarte....
| Código: |
#include<stdio.h> static void hanoi(int ,int,int,int);
main() { int x; //int primera_pi,segunda_pila=2,tercera_pila=3; printf("numeros de discos\n"); scanf("%d",&x); hanoi(x,1,2,3); }
static void hanoi(int n,int inic,int temp,int fin) { if(n==1){ hanoi(n-1,inic,temp,inic); printf("mover disco de la estaca %d a la estaca %d\n",inic,fin); }
if(n>1) {
hanoi(n-1,inic,fin,temp); printf("mover disco de la estaca %d a la estaca %d\n",inic,fin); hanoi(n-1,temp,inic,fin); } }
|
|
| | Volver arriba | |  | manuel_venezuela
Registrado: 02 Mar 2011 Mensajes: 41 Ubicación: venezuela
| Publicado: 09/06/2011 9:26 pm | | | Título: Re: Urgente! |
| no se hasta donde es tu conocimiento guarda a power.h y hanoi_iterativa.c en una misma carpeta, ambas compilalos ,...para que el segundo lea el primero...suerte.. |
| | Volver arriba | |  | | rdm
Registrado: 23 Abr 2014 Mensajes: 1
| Publicado: 23/04/2014 10:48 am | | | Título: ayuda torre de hanoi en c++ |
| alguien me puede ayudar a resolver un error con la torre de hanoi en c++
el problemas el que tengo que hacer la simulasion de las torre de hanoi usando una clase pila crearda por mi.
el error esta en que no puedo pasar un valor de un objeto tipo puntero a una variable.
ejemplo: string ad = a->MostrarInicio();
me sale error que dice:
|123|error: conversion from 'void' to non-scalar type 'std::string {aka std::basic_string<char>}' requested|
el codigo es este:
#include <iostream> #include <stdio.h> #include <stdlib.h>
using namespace std;
void Limpiar(); void Pausa();
class Nodo { public: string valor; Nodo *sig;
Nodo(string dato,Nodo *b) { valor = dato; sig = b; }
};
class Pila { public: Nodo *primero; Nodo *aux; Nodo *nuevo;
Pila() { primero = NULL;
}
bool Vacia() { return !primero; // Si el primero no existe, entonces la lista es vacia. }
void Insertar(string dato) { if(Vacia()) // Si es vacia, se inserta en el primero { primero = new Nodo(dato,NULL); } else { nuevo = new Nodo(dato,primero); primero=nuevo; }
}
void Eliminar() { aux = primero; primero = aux->sig; delete aux; }
void Mostrar() // Muestra por pantalla la lista { if(!Vacia()) { aux = primero;
while(aux) { cout << aux->valor << endl; aux = aux->sig; } } } void MostrarInicio() // Muestra por pantalla la lista { aux = primero; cout << aux->valor << endl;
}
};
int main() { Pila *a = new Pila(); Pila *b = new Pila(); Pila *c = new Pila(); //Pila *ad = new Pila();
a->Insertar("***********"); a->Insertar(" ********* "); a->Insertar(" ******* "); a->Insertar(" ***** "); a->Insertar(" *** "); a->Insertar(" * "); a->Mostrar(); cout<<"==================";
for(; { cout <<"1) Moder de la torre A hacia la torre B" << endl; cout <<"2) Moder de la torre A hacia la torre c" << endl; cout <<"3) Moder de la torre B hacia la torre A" << endl; cout <<"4) Moder de la torre B hacia la torre C" << endl; cout <<"5) Moder de la torre C hacia la torre A" << endl; cout <<"6) Moder de la torre C hacia la torre B" << endl; cout <<"Elija hacia donde desea mover el disco: "; int opccion; cin >> opccion; if(opccion == 1) { string ad = a->MostrarInicio(); // en esta linea me da el error
//string* Pila::* ad;
b->Insertar(ad); // para pasar el valor a este objeto a->Eliminar(); a->Mostrar(); b->Mostrar();
} if(opccion == 2) {
} if(opccion == 3) {
} if(opccion == 4) {
} if(opccion == 5) {
} if(opccion == 6) {
} }
return 0; }
void Pausa() { system("pause"); }
void Limpiar() { system("cls"); } |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7520 Ubicación: Mexico
| Publicado: 24/04/2014 1:34 pm | | | Título: |
| El problema principal con el programa se debe a que las dos funciones básicas de una pila son push (insertar) y pop (extraer) y tu solo tienes implementada la primera.
Como la operación extraer resulta en el valor al tope de la pila y la eliminación de ese nodo debes eliminar la función "eliminar" y sustituirla por:
| Código: | string extraer() { string rv = primero->valor; aux = primero; primero = aux->sig; delete aux; return rv; } |
Y el manejo del primer caso hay que cambiarlo a:
| Código: | cin >> opccion; if (opccion == 1) { b->Insertar(a->extraer()); a->Mostrar(); b->Mostrar(); } |
Hay mas cambios que hacer al programa, por ejemplo declaras todos los campos (propiedades en otros lenguajes) de las clases como públicos cuando deberían ser privados.
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |