Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/05/2013, 11:41
CrashNebula
 
Fecha de Ingreso: mayo-2013
Mensajes: 4
Antigüedad: 11 años
Puntos: 0
[ansi c] torres de hanoi

Estoy trabajando con las torres de hanoi. Quisiera que me ayudaran a descifrar
por qué mi código no funciona como debería.

El programa en debe ser gráfico y no narrativo. Algo como esto:
http://www.youtube.com/watch?v=xXTle8JYhys

Debo realizar el programa mediante funciones recursivas y no puedo utilizar métodos iterativos.

Las funciones donde probablemente esté el error son la g_MoverDiscos o g_TorreDeHanoiRecursiva.

En mi programa utilicé 3 arreglos unidimensionales para la "torres".
Uno que se llama Origen que se imprime a la izquierda, otro que se
llama intermedio que se imprime en el centro y el final se llama destino.





Mientras escribia esto note que los errores *parecen de impresión. :o. Creo que los
argumentos que se están pasando a la función imprimir se están cambiando debido a la
como tengo escrita la recursión en mi código. Alguna idea sobre como puedo solucionar
esto? (en caso de que esto sea el problema)

Cualquier ayuda es útil muchas gracias.

A continuación pondré las funciones donde creo que tengo el problema


Código C:
Ver original
  1. #define kMAX 30
  2. void g_MoverDiscos(int liFilas,int liNDiscos,
  3.  * * * * * * * * * int liTorreOrigen[kMAX],int liTorreDestino[kMAX])
  4. {
  5.  * *int liPosOrigen =0;
  6.  * *int liPosDestino=liFilas-1;
  7.  
  8.  * *//Busqueda de la posicio del menor disco en el origen
  9.  * *while(liTorreOrigen[liPosOrigen]==0 && liPosOrigen<liFilas-1)
  10.  * *{
  11.  * * * *liPosOrigen++;
  12.  * *}
  13.  
  14.  * *//Busqueda de la posicion del tope de la torre destino
  15.  * *while(liTorreDestino[liPosDestino]!=0 && liPosDestino>0)//Menor o igual
  16.  * *{
  17.  * * * *liPosDestino--;
  18.  * *}
  19.  * *liTorreDestino[liPosDestino]=liTorreOrigen[liPosOrigen];//Transferencia del disco
  20.  * *liTorreOrigen[liPosOrigen]=0;//Al moverse el disco esta posicion se hace cero.
  21. }
  22.  
  23.  
  24. void g_TorreDeHanoiRecursivo(int liFilas, int liNDiscos,int liTorreOrigen[kMAX],
  25.  * * * * * * * * * * * * * * int liTorreIntermedia[kMAX],int liTorreDestino[kMAX])
  26. {
  27.  
  28.  * *if(liNDiscos==1)
  29.  * *{
  30.  
  31.  * * * *g_MoverDiscos(liFilas, liNDiscos, liTorreOrigen, liTorreDestino);
  32.  * * * *system("cls");
  33.  * * * *g_ImprimirDiscos(liFilas, liTorreOrigen,
  34.  * * * * * * * * * * * * liTorreIntermedia, liTorreDestino);
  35.  
  36.  * *}//END if
  37.  * *else
  38.  * *{
  39.  * * * *g_TorreDeHanoiRecursivo(liFilas, liNDiscos-1,liTorreOrigen,
  40.  * * * * * * * * * * * * * * * *liTorreDestino,liTorreIntermedia);
  41.  
  42.  * * * *g_MoverDiscos(liFilas, liNDiscos, liTorreOrigen, liTorreDestino);
  43.  * * * *system("cls");
  44.  * * * *g_ImprimirDiscos(liFilas, liTorreOrigen,
  45.  * * * * * * * * * * * * *liTorreDestino,liTorreIntermedia);
  46.  
  47.  
  48.  * * * *g_TorreDeHanoiRecursivo(liFilas, liNDiscos-1,liTorreIntermedia,
  49.  * * * * * * * * * * * * * * * *liTorreOrigen,liTorreDestino);
  50.  * *}//END else
  51. }//END g_TorreDeHanoiRecursivo



///
/// Estas son las demás funciones de mi programa (todas estas están bien)
///

Código C:
Ver original
  1. /// Esta es para leer los discos
  2. int giLeerDiscos(void)
  3. {
  4.  * *int liN;
  5.  * *do
  6.  * *{
  7.  * * * *printf("\nIndique la cantidad de discos: ");
  8.  * * * *scanf("%d",&liN);
  9.  * * * *if(liN<1||liN>kMAX_DISCOS)
  10.  * * * *{
  11.  * * * * * *system("cls");
  12.  * * * * * *printf("ERROR.OPCION NO ES VALIDA. VUELVA A INTENTAR\n\n");
  13.  * * * *}
  14.  * *}while(liN<1||liN>kMAX_DISCOS);
  15.  * *return liN;
  16. }
  17.  
  18.  
  19. //Funcion incializa los arreglos a la condicion *que deben tener antes de jugar
  20. void g_CondicionInicialHanoi(int liNDiscos,int liTorreOrigen[kMAX],
  21.  * * * * * * * * * * * * * * int liTorreIntermedia[kMAX],int liTorreDestino[kMAX])
  22. {
  23.  * *int i;
  24.  * *for (i=0;i<liNDiscos;i++)
  25.  * *{
  26.  * * * *liTorreOrigen[i]=i+1; * * * //Se colocan los discos desde el 1 en manera ascendente
  27.  * * * *liTorreIntermedia[i]=0; * * //Se hace cero
  28.  * * * *liTorreDestino[i]=0; * * * *//Se hace cero
  29.  * *}
  30. }
  31.  
  32.  
  33. void g_ImprimirDiscos(int liFilas,int liTorreOrigen[kMAX],
  34.  * * * * * * * * * * * *int liTorreIntermedia[kMAX],int liTorreDestino[kMAX])
  35. {
  36.  * *int i;
  37.  
  38.  * *for (i=0;i<liFilas;i++)
  39.  * *{
  40.  
  41.  * * * *printf("%d\t",liTorreOrigen[i]);
  42.  * * * *printf("%d\t",liTorreIntermedia[i]);
  43.  * * * *printf("%d\t",liTorreDestino[i]);
  44.  * * * *printf("\n");
  45.  * *}
  46. }
  47.  
  48. int *main()
  49. {
  50.  * *int liTorreOrigen[kMAX];
  51.  * *int liTorreIntermedia[kMAX];
  52.  * *int liTorreDestino[kMAX];
  53.  * *int liNDiscos;
  54.  * *int liFilas; // Es igual al numero inicial de discos. Define el espacio
  55.  * * * * * * * * // de juego.
  56.  
  57.  
  58.  * *liNDiscos=giLeerDiscos();
  59.  * *liFilas=liNDiscos;
  60.  * *//Condicion inicial del juego
  61.  * *g_CondicionInicialHanoi(liNDiscos,liTorreOrigen,
  62.  * * * * * * * * * * * * * *liTorreIntermedia,liTorreDestino);
  63.  
  64.  * *//Imprimir condicion inicial del juego
  65.  * *system("cls");
  66.  * *g_ImprimirDiscos(liNDiscos,liTorreOrigen,
  67.  * * * * * * * * * * liTorreIntermedia,liTorreDestino);
  68.  * *g_TorreDeHanoiRecursivo(liFilas, liNDiscos,liTorreOrigen,
  69.  * * * * * * * * * * * * * *liTorreIntermedia,liTorreDestino);
  70.  * *printf("\n");
  71. return 0;
  72. }