Hanoi recursivo lenguaje C
Publicado por ElZar (1 intervención) el 05/12/2011 00:00:44
Si lo compiláis con el Dev-C++ no os dará ningún error en el código...
Alguien puede echarme una mano? Creo que el error está en el tema de los punteros.. Ya que si lo debugáis hay un punto que no entra en ninguno de los caso de "Otra_torre".
Si hubiése un fallo en el códgio seria en Otra_Torre, las otras funciones seguro que están bien...
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define GRAD2PI (3.14159265359F/180.F)
void Mover_Piezas(float *Torre_A,float *Torre_B, int Npeces);
float Otra_Torre(float *Torre_A, float *Torre_B);
void Canviar_Pieza(float *Torre_A, float *Torre_B);
float Torre_A[6], Torre_B[6], Torre_C[6],x,y,z;
int Npiezas=0;
int main(void){
Torre_A[0]= 322.F; // X
Torre_A[1]= 211.F; // Y
Torre_A[2]= 46.F; // Z
Torre_A[3]= (float)atan2(Torre_A[1], Torre_A[0]); // YAW
Torre_A[4]= 90.F*GRAD2PI; // PITCH
Torre_A[5]= 0.F*GRAD2PI; // ROLL
Torre_B[0]= 0.F;; // X
Torre_B[1]= 380.F; // Y
Torre_B[2]= 41.F; // Z
Torre_B[3]= (float)atan2(Torre_B[1], Torre_B[0]); // YAW
Torre_B[4]= 90.F*GRAD2PI; // PITCH
Torre_B[5]= 0.F*GRAD2PI; // ROLL
Torre_C[0]= 180.F; // X
Torre_C[1]= 300.F; // Y
Torre_C[2]= 206.F; // Z
Torre_C[3]= (float)atan2(Torre_C[1], Torre_C[0]); // YAW
Torre_C[4]= 90.F*GRAD2PI; // PITCH
Torre_C[5]= 0.F*GRAD2PI; // ROLL
x = Torre_A[0];
y = Torre_B[0];
z = Torre_C[0];
printf("Escribe número piezas que tendrá la torre de Hanoi: ");
scanf("%d",&Npiezas);
Mover_Piezas(Torre_A, Torre_B, Npiezas);
return 0;
}
void Mover_Piezas(float *Torre_A,float *Torre_B, int Npiezas)
{
*Torre_C= Otra_Torre(Torre_A, Torre_B); // Busca la torre auxiliar
if(Npiezas!=1)
{
Mover_Piezas(Torre_A, Torre_C, Npiezas-1);
Canviar_Pieza(Torre_A, Torre_B); // Sólo mueve la pieza superior
Mover_Piezas(Torre_C, Torre_B, Npiezas-1);
}else{
Canviar_Pieza(Torre_A, Torre_B); // Sólo mueve la pieza superior
}
}
float Otra_Torre(float *Torre_A, float *Torre_B)
{
if(((Torre_A[0]==x)&&(Torre_B[0]==y)) || ((Torre_A[0]==y)&&(Torre_B[0]==x))) {
return *Torre_C;
}
if(((Torre_A[0]==y)&&(Torre_B[0]==z)) || ((Torre_A[0]==z)&&(Torre_B[0]==y))) {
return *Torre_A;
}
if(((Torre_A[0]==z)&&(Torre_B[0]==x)) || ((Torre_A[0]==x)&&(Torre_B[0]==z))){
return *Torre_B;
}
}
void Canviar_Pieza(float *Torre_A, float *Torre_B){
printf("\n%f->%f\n",Torre_A[0],Torre_B[0]);
}
Alguien puede echarme una mano? Creo que el error está en el tema de los punteros.. Ya que si lo debugáis hay un punto que no entra en ninguno de los caso de "Otra_torre".
Si hubiése un fallo en el códgio seria en Otra_Torre, las otras funciones seguro que están bien...
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define GRAD2PI (3.14159265359F/180.F)
void Mover_Piezas(float *Torre_A,float *Torre_B, int Npeces);
float Otra_Torre(float *Torre_A, float *Torre_B);
void Canviar_Pieza(float *Torre_A, float *Torre_B);
float Torre_A[6], Torre_B[6], Torre_C[6],x,y,z;
int Npiezas=0;
int main(void){
Torre_A[0]= 322.F; // X
Torre_A[1]= 211.F; // Y
Torre_A[2]= 46.F; // Z
Torre_A[3]= (float)atan2(Torre_A[1], Torre_A[0]); // YAW
Torre_A[4]= 90.F*GRAD2PI; // PITCH
Torre_A[5]= 0.F*GRAD2PI; // ROLL
Torre_B[0]= 0.F;; // X
Torre_B[1]= 380.F; // Y
Torre_B[2]= 41.F; // Z
Torre_B[3]= (float)atan2(Torre_B[1], Torre_B[0]); // YAW
Torre_B[4]= 90.F*GRAD2PI; // PITCH
Torre_B[5]= 0.F*GRAD2PI; // ROLL
Torre_C[0]= 180.F; // X
Torre_C[1]= 300.F; // Y
Torre_C[2]= 206.F; // Z
Torre_C[3]= (float)atan2(Torre_C[1], Torre_C[0]); // YAW
Torre_C[4]= 90.F*GRAD2PI; // PITCH
Torre_C[5]= 0.F*GRAD2PI; // ROLL
x = Torre_A[0];
y = Torre_B[0];
z = Torre_C[0];
printf("Escribe número piezas que tendrá la torre de Hanoi: ");
scanf("%d",&Npiezas);
Mover_Piezas(Torre_A, Torre_B, Npiezas);
return 0;
}
void Mover_Piezas(float *Torre_A,float *Torre_B, int Npiezas)
{
*Torre_C= Otra_Torre(Torre_A, Torre_B); // Busca la torre auxiliar
if(Npiezas!=1)
{
Mover_Piezas(Torre_A, Torre_C, Npiezas-1);
Canviar_Pieza(Torre_A, Torre_B); // Sólo mueve la pieza superior
Mover_Piezas(Torre_C, Torre_B, Npiezas-1);
}else{
Canviar_Pieza(Torre_A, Torre_B); // Sólo mueve la pieza superior
}
}
float Otra_Torre(float *Torre_A, float *Torre_B)
{
if(((Torre_A[0]==x)&&(Torre_B[0]==y)) || ((Torre_A[0]==y)&&(Torre_B[0]==x))) {
return *Torre_C;
}
if(((Torre_A[0]==y)&&(Torre_B[0]==z)) || ((Torre_A[0]==z)&&(Torre_B[0]==y))) {
return *Torre_A;
}
if(((Torre_A[0]==z)&&(Torre_B[0]==x)) || ((Torre_A[0]==x)&&(Torre_B[0]==z))){
return *Torre_B;
}
}
void Canviar_Pieza(float *Torre_A, float *Torre_B){
printf("\n%f->%f\n",Torre_A[0],Torre_B[0]);
}
Valora esta pregunta


0