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

Ya solucioné el problema. Mi solución no es elegante pero funciona.

La función:
Código C:
Ver original
  1. void g_TorreDeHanoiRecursivo(int liFilas, int liNDiscos,int liTorreOrigen[kMAX],
  2.                              int liTorreIntermedia[kMAX],int liTorreDestino[kMAX])
  3. {
  4. .....
  5. }
Le agregue tres argumentos los cuales se mantendrán en la misma posición dentro de la función.

Código C:
Ver original
  1. void g_TorreDeHanoiRecursivo(int liFilas, int liNDiscos,int liTorreOrigen[kMAX],
  2.                              int liTorreIntermedia[kMAX],int liTorreDestino[kMAX],
  3.                              int O[kMAX],int I[kMAX], int D[kMAX])
  4. {
  5. .....
  6. }
Al ejecutarse el programa

Las posiciones de liTorreOrigen y O estarán ocupadas por el mismo arreglo
Las posiciones de liTorreIntermedia y I estarán ocupadas otro arreglo igual para las dos posiciones
Las posiciones de liTorreDestino y D es el mismo caso.

Todo el proceso recursivo estará a cargo de los parametros liTorreOrigen, liTorreIntermedia y liTorreDestino. Como O apuntará a la misma dirección de memoria que liTorreOrigen y así sucesivamente para los otros casos entonces puedo escribir
Código C:
Ver original
  1. g_ImprimirDiscos(liFilas,O,I,D);
y siempre se imprimirá en el orden correcto porque aprovecha que no se cambia de posición en la función y por ende apuntará correctamente a la dirección de memoria deseada.

Debajo posteare la nueva función:
Código C:
Ver original
  1. void g_TorreDeHanoiRecursivo(int liFilas, int liNDiscos,int liTorreOrigen[kMAX],
  2.                              int liTorreIntermedia[kMAX],int liTorreDestino[kMAX],
  3.                              int O[kMAX],int I[kMAX], int D[kMAX])
  4. {
  5.  
  6.     if(liNDiscos==1)
  7.     {
  8.  
  9.         g_MoverDiscos(liFilas, liNDiscos, liTorreOrigen, liTorreDestino);
  10.         system("cls");
  11.         //g_ImprimirDiscos(liFilas,liTorreOrigen,liTorreIntermedia,liTorreDestino);
  12.         g_ImprimirDiscos(liFilas,O, I, D);
  13.         system("pause");
  14.  
  15.     }//END if
  16.     else
  17.     {
  18.         g_TorreDeHanoiRecursivo(liFilas, liNDiscos-1,liTorreOrigen,
  19.                                 liTorreDestino,liTorreIntermedia,O,I,D);
  20.  
  21.         g_MoverDiscos(liFilas, liNDiscos, liTorreOrigen, liTorreDestino);
  22.         system("cls");
  23.          //g_ImprimirDiscos(liFilas,liTorreOrigen,liTorreIntermedia,liTorreDestino);
  24.          g_ImprimirDiscos(liFilas,O,I,D);
  25.  
  26.          system("pause");
  27.  
  28.         g_TorreDeHanoiRecursivo(liFilas, liNDiscos-1,liTorreIntermedia,
  29.                                 liTorreOrigen,liTorreDestino,O,I,D);
  30.     }//END else
  31. }//END g_TorreDeHanoiRecursivo

vosk ahora escribí todo sin los desreferenciadores =P

Gracias por todo amigos.