Pongo aqui el ejercicio 6 de la hoja 5. El ejercicio de las torres de hanoi con representación grafica (no como se ven algunos ejemplos de Hanoi en C que hay por internet que solo listan los movimientos que hay que realizar) y usando la recursividad, pero que solo puede soportar hasta 6 discos, por el tamaño de la consola (aunque no dudo que pueda más discos):
Se puede compiliar para linux o para windows cambiando la variable SO
#include<stdio.h>
#include<stdlib.h>
#define MAX 6
#define SO 1//1 Linux, 0 Windows
void inicializarHanoi(int *O,int *A,int *D,int discos);
int imprimeTorres(int *O,int *A,int *D,int discos);
int resolverHanoi(int elementos, int *O,int *A,int *D,int discos,int *es_Origen,int *es_Auxiliar,int *es_Destino); //Esos ultimos 3 parametros indican cual es realmente cada torre, importante para la funcion recursiva
int mover(int *T1,int *T2,int discos);
int disco_superior(int *T,int discos);
main()
{
int discos,O[MAX],A[MAX],D[MAX];
printf("Torres Hanoi\n");
printf("Introduce num. de discos: (MAX 6)\n");
scanf("%d",&discos);
printf("\n");
inicializarHanoi(O,A,D,discos);
imprimeTorres(O,A,D,discos);
resolverHanoi(discos,O,A,D,discos,O,A,D);
}
void inicializarHanoi(int *O,int *A,int *D,int discos)
{
int cont,cont2,asterisco=0;
int aux=discos;
for(cont=0;cont<=discos-1;cont++)
{
O[cont]=aux*2-1;
aux--;
}
for(cont=0;cont<=discos-1;cont++)
{
D[cont]=0;
A[cont]=0;
}
}
int disco_superior(int *T,int discos)
{
int disco_superior_T=0;
int cont,disco_T=0;
for(cont=0;cont<discos;cont++)
{
if(T[cont]!=0)
{
disco_superior_T=T[cont];
disco_T=cont;
}
}
return(disco_T);
}
int mover(int *T1,int *T2,int discos)
{
int disco_superior_T1=0;
int disco_superior_T2=0;
int disco_T1=discos,disco_T2=discos;
int cont=0;
disco_T1=disco_superior(T1,discos);
disco_T2=disco_superior(T2,discos);
disco_superior_T1=T1[disco_T1];
disco_superior_T2=T2[disco_T2];
if(disco_superior_T2==0)
{
T2[0]=disco_superior_T1;
}
else
{
T2[disco_T2+1]=disco_superior_T1;
}
T1[disco_T1]=0;
}
imprimeTorres(int *O,int *A,int *D,int discos)
{
int cont,cont2=0,cont3,cont4=0;
printf("----Torre O----\n");
cont4=0;
for(cont=discos-1;cont>=0;cont--)
{
for(cont3=O[cont];cont3<=discos+cont4;cont3++)
{
printf(" ");
}
for(cont2=1;cont2<=O[cont];cont2++)
{
printf("*",cont2);
}
cont4++;
printf("\n");
}
printf("----Torre A----\n");
cont4=0;
for(cont=discos-1;cont>=0;cont--)
{
for(cont3=A[cont];cont3<=discos+cont4;cont3++)
{
printf(" ");
}
for(cont2=1;cont2<=A[cont];cont2++)
{
printf("*",cont2);
}
cont4++;
printf("\n");
}
printf("----Torre D----\n");
cont4=0;
for(cont=discos-1;cont>=0;cont--)
{
for(cont3=D[cont];cont3<=discos+cont4;cont3++)
{
printf(" ");
}
for(cont2=1;cont2<=D[cont];cont2++)
{
printf("*",cont2);
}
cont4++;
printf("\n");
}
if(SO==1)
{
system("sleep 1");
system("clear");
}
else
{
system("pause");
system("cls");
}
}
int resolverHanoi(int elementos, int *O,int *A,int *D,int discos,int *es_Origen,int *es_Auxiliar,int *es_Destino)
{
if(elementos==1){
mover(O,D,discos);
imprimeTorres(es_Origen,es_Auxiliar,es_Destino,discos);
}
else
{
resolverHanoi(elementos-1,O,D,A,discos,es_Origen,es_Auxiliar,es_Destino);
resolverHanoi(1,O,A,D,discos,es_Origen,es_Auxiliar,es_Destino);
resolverHanoi(elementos-1,A,O,D,discos,es_Origen,es_Auxiliar,es_Destino);
}
}