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;
}