bump
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes MenúCita de: amchacon en 26 Mayo 2013, 13:40 PM
Si es recursivo no hay que hacer tanto.
El algoritmo para mover torres de un poste A a un poste C es el siguiente:
Simplementa hay que implementarlo al pie de la letra:void Mover(char Inicial,char Auxiliar,char Destino,int N)
{
if (N == 1)
printf ("Moviendo disco %c al poste %c",Inicial,Destino);
else
{
Mover(Inicial,Destino,Auxiliar,n-1); // Mover todos los discos -1 al auxiliar
printf("Moviendo disco %c al poste %c",Inicial,Destino); // Moviendo el grande al final
Mover(Auxiliar,Destino,Inicial,n-1); // Moviendo los discos desde el auxiliar al final
}
}
Ponle de nombre a los postes A,B,C y haz la prueba.
#define kMAX 30
void g_MoverDiscos(int liFilas,int liNDiscos,
int liTorreOrigen[kMAX],int liTorreDestino[kMAX])
{
int liPosOrigen =0;
int liPosDestino=liFilas-1;
//Busqueda de la posicio del menor disco en el origen
while(liTorreOrigen[liPosOrigen]==0 && liPosOrigen<liFilas-1)
{
liPosOrigen++;
}
//Busqueda de la posicion del tope de la torre destino
while(liTorreDestino[liPosDestino]!=0 && liPosDestino>0)//Menor o igual
{
liPosDestino--;
}
liTorreDestino[liPosDestino]=liTorreOrigen[liPosOrigen];//Transferencia del disco
liTorreOrigen[liPosOrigen]=0;//Al moverse el disco esta posicion se hace cero.
}
void g_TorreDeHanoiRecursivo(int liFilas, int liNDiscos,int liTorreOrigen[kMAX],
int liTorreIntermedia[kMAX],int liTorreDestino[kMAX])
{
if(liNDiscos==1)
{
g_MoverDiscos(liFilas, liNDiscos, liTorreOrigen, liTorreDestino);
system("cls");
g_ImprimirDiscos(liFilas, liTorreOrigen,
liTorreIntermedia, liTorreDestino);
}//END if
else
{
g_TorreDeHanoiRecursivo(liFilas, liNDiscos-1,liTorreOrigen,
liTorreDestino,liTorreIntermedia);
g_MoverDiscos(liFilas, liNDiscos, liTorreOrigen, liTorreDestino);
system("cls");
g_ImprimirDiscos(liFilas, liTorreOrigen,
liTorreDestino,liTorreIntermedia);
g_TorreDeHanoiRecursivo(liFilas, liNDiscos-1,liTorreIntermedia,
liTorreOrigen,liTorreDestino);
}//END else
}//END g_TorreDeHanoiRecursivo
/// Esta es para leer los discos
int giLeerDiscos(void)
{
int liN;
do
{
printf("\nIndique la cantidad de discos: ");
scanf("%d",&liN);
if(liN<1||liN>kMAX_DISCOS)
{
system("cls");
printf("ERROR.OPCION NO ES VALIDA. VUELVA A INTENTAR\n\n");
}
}while(liN<1||liN>kMAX_DISCOS);
return liN;
}
//Funcion incializa los arreglos a la condicion que deben tener antes de jugar
void g_CondicionInicialHanoi(int liNDiscos,int liTorreOrigen[kMAX],
int liTorreIntermedia[kMAX],int liTorreDestino[kMAX])
{
int i;
for (i=0;i<liNDiscos;i++)
{
liTorreOrigen[i]=i+1; //Se colocan los discos desde el 1 en manera ascendente
liTorreIntermedia[i]=0; //Se hace cero
liTorreDestino[i]=0; //Se hace cero
}
}
void g_ImprimirDiscos(int liFilas,int liTorreOrigen[kMAX],
int liTorreIntermedia[kMAX],int liTorreDestino[kMAX])
{
int i;
for (i=0;i<liFilas;i++)
{
printf("%d\t",liTorreOrigen[i]);
printf("%d\t",liTorreIntermedia[i]);
printf("%d\t",liTorreDestino[i]);
printf("\n");
}
}
int main()
{
int liTorreOrigen[kMAX];
int liTorreIntermedia[kMAX];
int liTorreDestino[kMAX];
int liNDiscos;
int liFilas; // Es igual al numero inicial de discos. Define el espacio
// de juego.
liNDiscos=giLeerDiscos();
liFilas=liNDiscos;
//Condicion inicial del juego
g_CondicionInicialHanoi(liNDiscos,liTorreOrigen,
liTorreIntermedia,liTorreDestino);
//Imprimir condicion inicial del juego
system("cls");
g_ImprimirDiscos(liNDiscos,liTorreOrigen,
liTorreIntermedia,liTorreDestino);
g_TorreDeHanoiRecursivo(liFilas, liNDiscos,liTorreOrigen,
liTorreIntermedia,liTorreDestino);
printf("\n");
return 0;
}