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
#include <stdio.h> #include <stdlib.h> #define VALOR 4 int llenarOrigen(int vector[VALOR]){ int i; for (i=0;i<VALOR;i++) vector[i]=1; } int llenarResto(int vector[VALOR]){ int i; for (i=0;i<VALOR;i++) vector[i]=0; } void imprime (int O[VALOR], int A[VALOR], int D[VALOR]){ int i; for (i=VALOR-1;i>=0;i--) } int moverDisco(int discos,int O[VALOR],int A[VALOR],int D[VALOR],char o, char d) { int i,j,salida1=0,salida2=0; i=VALOR; j=-1; if (o=='o'){ if (d=='a'){ // Torre origen O, torre destino A while (salida1==0) { i--; if (O[i]==1) salida1=1; if (i==0) salida1=1; } while (salida2==0) { j++; if (A[j]==0) salida2=1; if (j==VALOR-1) salida2=1; } O[i]=0; A[i]=1; } if (d=='d'){ // Torre origen O, torre destino D while (salida1==0) { i--; if (O[i]==1) salida1=1; if (i==0) salida1=1; } while (salida2==0) { j++; if (D[j]==0) salida2=1; if (j==VALOR-1) salida2=1; } O[i]=0; D[j]=1; } } if (o=='a'){ if (d=='o'){ // Torre origen A, torre destino O while (salida1==0) { i--; if (A[i]==1) salida1=1; if (i==0) salida1=1; } while (salida2==0) { j++; if (O[j]==0) salida2=1; if (j==VALOR-1) salida2=1; } A[i]=0; O[j]=1; } if (d=='d'){ // Torre origen A, torre destino D while (salida1==0) { i--; if (A[i]==1) salida1=1; if (i==0) salida1=1; } while (salida2==0) { j++; if (D[j]==0) salida2=1; if (j==VALOR-1) salida2=1; } A[i]=0; D[j]=1; } } if (o=='d'){ if (d=='a'){ // Torre origen D, torre destino A while (salida1==0) { i--; if (D[i]==1) salida1=1; if (i==0) salida1=1; } while (salida2==0) { j++; if (A[j]==0) salida2=1; if (j==VALOR-1) salida2=1; } D[i]=0; A[j]=1; } if (d=='o'){ // Torre origen D, torre destino O while (salida1==0) { i--; if (D[i]==1) salida1=1; if (i==0) salida1=1; } while (salida2==0) { j++; if (O[j]==0) salida2=1; if (j==VALOR-1) salida2=1; } D[i]=0; O[j]=1; } } imprime(O,A,D); } void hanoi(int discos, int O[VALOR], int A[VALOR], int D[VALOR], char o, char a, char d){ if (discos==1) { moverDisco(discos,O,A,D,o,d); } else { hanoi(discos-1,O,A,D,o,d,a); moverDisco(discos,O,A,D,o,d); hanoi(discos-1,O,A,D,a,o,d); } } void main() { int O[VALOR], A[VALOR], D[VALOR], i; int discos=VALOR; llenarOrigen(O); llenarResto(A); llenarResto(D); imprime(O,A,D); hanoi(discos,O,A,D,'o','a','d'); }