Programación General > C/C++
Re: Please! codigo source de TORRES DE HANOI
(1/1)
borca:
Si alguien tiene o sabe el codigo source del juego de torres de hanoi...porfavor haganmelo saber, lo necesitare para sacar unas ideas de codigos recursivos....torres de hanoi es el tipico juego donde hay tres torres y hay que organizar unos platos en forma creciente ;)
Avalon:
Lo puedes encontrar en:
http://www.mundoc.net/
En la sección de Archivos fuente -> Funciones matemáticas
Salu2,
Avalon
rafael:
Aqui tienes un programa que soluciona el problema recursivamente.
La parte principal del programa (la que soluciona el problema) lo constituye funcion recursiva:
void torres(struct torrehanoi *fuente,struct torrehanoi *destino,struct torrehanoi *auxiliar,int numdiscos){
if(numdiscos==1)
moverdisco(fuente,destino);
else{
torres(fuente,auxiliar,destino,numdiscos-1);
moverdisco(fuente,destino);
torres(auxiliar,destino,fuente,numdiscos-1);
}
}
La cual realiza los movimientos de discos de la torre 'fuente' a torre 'destino'. El parámetro 'numdiscos' es la cantidad de discos a ser movidos y 'auxiliar' es la tercera torre que interviene en este problema.
Este es el código fuente del programa.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
#define MAXDISCOS 50
struct torrehanoi{
char *nombretorre;
int discos[MAXDISCOS]; /* discos que forman la torre (discos[0]=disco de la base) */
int cima; /* indice del disco que esta en la cima de la torre (discos[cima]=disco de la cima) */
};
void moverdisco(struct torrehanoi *fuente,struct torrehanoi *destino){
int disco=fuente->discos[(fuente->cima)];
/* imprime en pantalla un mensaje indicando el movimiento a efectuar */
printf("-> disco %d de la torre %s a la torre %sn",
disco,fuente->nombretorre,destino->nombretorre);
/* se efectua el traslado del disco de torre a torre */
fuente->discos[(fuente->cima)--]=0;
destino->discos[++(destino->cima)]=disco;
}
void torres(struct torrehanoi *fuente,struct torrehanoi *destino,struct torrehanoi *auxiliar,int numdiscos){
if(numdiscos==1)
moverdisco(fuente,destino);
else{
torres(fuente,auxiliar,destino,numdiscos-1);
moverdisco(fuente,destino);
torres(auxiliar,destino,fuente,numdiscos-1);
}
}
void inicializartorre(struct torrehanoi *T,char *nombretorre,int numdiscos){
int i;
for(i=0;i<MAXDISCOS;i++) T->discos=0;
for(i=0;i<numdiscos;i++) T->discos=numdiscos-i;
T->cima=numdiscos-1;
T->nombretorre=nombretorre;
}
int main(){
int i;
struct torrehanoi A,B,C;
int numdiscos=3; /* numero de discos a utilizar */
inicializartorre(&A,"A",numdiscos);
inicializartorre(&B,"B",0);
inicializartorre(&C,"C",0);
printf("nLAS TORRES DE HANOInn");
printf("A = FuentenC = DestinonB = Auxiliarn");
printf("Movimientos realizados con %d discos:n",numdiscos);
torres(&A,&C,&B,numdiscos);
/* muestra los discos en la torre C */
printf("nLos discos en la torre C, desde la base, son:n");
for(i=0;i<=C.cima;i++){
printf("%d ",C.discos);
}
return 0;
}
borca:
!! Gracias Avalon y rafael por las respuestas;)
pero hay algo que no comprendo bien...trabajando recursivamente en la funcion torres, la que realiza los movimientos
if(numdiscos==1)
moverdisco(fuente,destino);
else{
torres(fuente,auxiliar,destino,numdiscos-1);
moverdisco(fuente,destino);
torres(auxiliar,destino,fuente,numdiscos-1);
por que se hace un llamada de nuevo con numdiscos-1...donde se trata el disco numdisco????
chimps:
http://www.planet-source-code.com/vb/sc ... 0&lngWId=3
Navegación
Ir a la versión completa