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#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--)
printf("%i %i %i\n",O
[i
],A
[i
],D
[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;
printf("----- Torres de Hanoi -----\n"); llenarOrigen(O);
llenarResto(A);
llenarResto(D);
imprime(O,A,D);
hanoi(discos,O,A,D,'o','a','d');
}