Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/01/2015, 17:55
inazense
Invitado
 
Mensajes: n/a
Puntos:
Pregunta Torres de Hanoi gráficas recursivas

Lo primero hola, soy nuevo en este foro. Es un poco cutre presentarse y pedir ya ayuda, pero llevo peleandome con este código y necesito consejo :)

Estoy haciendo un programa que represente el ejercicio de las torres de hanoi gráficamente. Aún no está acabado, pues sólo los muestra como números y no haciendo torres de mayor a menor y ni siquiera pide al usuario el tamaño de los discos (lo haré una vez seguro de que puedo hacer funcionar bien el programa) y me ha surgido un fallo con la función moverdisco.

Si realizo el movimiento a las torre O (origen) o D (destino) funciona perfectamente, pero de cualquiera de ellas a la A (auxiliar) no empieza por la parte inferior, pone los discos donde le place (o esa sensación da). ¿Podéis guiarme para encontrar donde estoy fallando?

El código es este:

Código c:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define VALOR 4
  5.  
  6. int llenarOrigen(int vector[VALOR]){
  7.     int i;
  8.  
  9.     for (i=0;i<VALOR;i++)
  10.         vector[i]=1;
  11.    
  12. }
  13.  
  14. int llenarResto(int vector[VALOR]){
  15.     int i;
  16.  
  17.     for (i=0;i<VALOR;i++)
  18.         vector[i]=0;
  19. }
  20.  
  21. void imprime (int O[VALOR], int A[VALOR], int D[VALOR]){
  22.     int i;
  23.  
  24.     for (i=VALOR-1;i>=0;i--)
  25.         printf("%i %i %i\n",O[i],A[i],D[i]);   
  26. }
  27.  
  28. int moverDisco(int discos,int O[VALOR],int A[VALOR],int D[VALOR],char o, char d) {
  29.  
  30.     int i,j,salida1=0,salida2=0;
  31.  
  32.     i=VALOR;
  33.     j=-1;
  34.  
  35.     if (o=='o'){
  36.         if (d=='a'){ // Torre origen O, torre destino A
  37.             while (salida1==0) {
  38.                 i--;
  39.                 if (O[i]==1)
  40.                     salida1=1;
  41.                 if (i==0)
  42.                     salida1=1;
  43.             }
  44.             while (salida2==0) {
  45.                 j++;
  46.                 if (A[j]==0)
  47.                     salida2=1;
  48.                 if (j==VALOR-1)
  49.                     salida2=1;
  50.             }
  51.            
  52.             O[i]=0;
  53.             A[i]=1;
  54.         }
  55.         if (d=='d'){ // Torre origen O, torre destino D
  56.             while (salida1==0) {
  57.                 i--;
  58.                 if (O[i]==1)
  59.                     salida1=1;
  60.                 if (i==0)
  61.                     salida1=1;
  62.             }
  63.             while (salida2==0) {
  64.                 j++;
  65.                 if (D[j]==0)
  66.                     salida2=1;
  67.                 if (j==VALOR-1)
  68.                     salida2=1;
  69.             }
  70.  
  71.             O[i]=0;
  72.             D[j]=1;
  73.         }          
  74.     }
  75.     if (o=='a'){
  76.         if (d=='o'){ // Torre origen A, torre destino O
  77.             while (salida1==0) {
  78.                 i--;
  79.                 if (A[i]==1)
  80.                     salida1=1;
  81.                 if (i==0)
  82.                     salida1=1;
  83.             }
  84.             while (salida2==0) {
  85.                 j++;
  86.                 if (O[j]==0)
  87.                     salida2=1;
  88.                 if (j==VALOR-1)
  89.                     salida2=1;
  90.             }
  91.            
  92.             A[i]=0;
  93.             O[j]=1;
  94.         }
  95.         if (d=='d'){ // Torre origen A, torre destino D
  96.             while (salida1==0) {
  97.                 i--;
  98.                 if (A[i]==1)
  99.                     salida1=1;
  100.                 if (i==0)
  101.                     salida1=1;
  102.             }
  103.             while (salida2==0) {
  104.                 j++;
  105.                 if (D[j]==0)
  106.                     salida2=1;
  107.                 if (j==VALOR-1)
  108.                     salida2=1;
  109.             }
  110.            
  111.             A[i]=0;
  112.             D[j]=1;
  113.         }
  114.     }
  115.     if (o=='d'){
  116.         if (d=='a'){ // Torre origen D, torre destino A
  117.             while (salida1==0) {
  118.                 i--;
  119.                 if (D[i]==1)
  120.                     salida1=1;
  121.                 if (i==0)
  122.                     salida1=1;
  123.             }
  124.             while (salida2==0) {
  125.                 j++;
  126.                 if (A[j]==0)
  127.                     salida2=1;
  128.                 if (j==VALOR-1)
  129.                     salida2=1;
  130.             }
  131.            
  132.             D[i]=0;
  133.             A[j]=1;
  134.         }
  135.         if (d=='o'){ // Torre origen D, torre destino O
  136.             while (salida1==0) {
  137.                 i--;
  138.                 if (D[i]==1)
  139.                     salida1=1;
  140.                 if (i==0)
  141.                     salida1=1;
  142.             }
  143.             while (salida2==0) {
  144.                 j++;
  145.                 if (O[j]==0)
  146.                     salida2=1;
  147.                 if (j==VALOR-1)
  148.                     salida2=1;
  149.             }
  150.            
  151.             D[i]=0;
  152.             O[j]=1;
  153.         }
  154.     }
  155.  
  156.     imprime(O,A,D);
  157.     getchar();
  158. }
  159.  
  160. void hanoi(int discos, int O[VALOR], int A[VALOR], int D[VALOR], char o, char a, char d){
  161.  
  162.     if (discos==1) {
  163.         moverDisco(discos,O,A,D,o,d);
  164.     }
  165.     else {
  166.         hanoi(discos-1,O,A,D,o,d,a);
  167.         moverDisco(discos,O,A,D,o,d);
  168.         hanoi(discos-1,O,A,D,a,o,d);
  169.     }
  170. }
  171.  
  172. void main() {
  173.    
  174.     int O[VALOR], A[VALOR], D[VALOR], i;
  175.     int discos=VALOR;
  176.    
  177.     system("clear");
  178.    
  179.     printf("----- Torres de Hanoi -----\n");
  180.     llenarOrigen(O);
  181.     llenarResto(A);
  182.     llenarResto(D);
  183.  
  184.     imprime(O,A,D);
  185.     getchar();
  186.     hanoi(discos,O,A,D,'o','a','d');
  187.    
  188. }

Última edición por inazense; 20/01/2015 a las 02:37