Sábado 9 de Noviembre de 2024, 03:40
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Ayuda Salto De Caballo (recursion Infinita)
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Ayuda Salto De Caballo (recursion Infinita) (Leído 1962 veces)
rafaeljosem
Nuevo Miembro
Mensajes: 4
Ayuda Salto De Caballo (recursion Infinita)
«
en:
Domingo 20 de Agosto de 2006, 04:16 »
0
Hola
Necesito ayuda con el siguiente codigo, el problema es que la funcion saltocaballo() se llama a si misma infinitamente, no se que hacer.
Este programa tiene como objetivo buscar la secuencia de saltos ha de dar un caballo de ajedrez, partiendo de una casilla cualquiera, para pasar por cada una de las casillas del tablero
Código: Text
#define N 8
#define n (N+1)
void saltocaballo(int i, int x, int y, int *exito);
void escribetablero();
int tablero[n][n];
int d[8][2] = {{2,1}, {1,2}, {-1,2}, {-2,1},{-2,-1}, {-1,-2},
{1,-2}, {2,-1}}; // los 8 posibles movimientos del caballo se obtienen sumando
//estos valores con la posicion actual (x,y)
int main(void)
{
int x, y;
int solucion, i, j;
do{
printf("\nCoordenadas iniciales del caballo ");
scanf ("%d %d", &x, &y);
} while ((x<1) || (x > N) ||
(y < 1) || (y > N));
//valores iniciales del tablero
for (i = 1; i <=N; i++)
for (j = 1; j<=N; j++)
tablero[i][j] = 0;
tablero[x][y] = 1;
//llamada con coordenadas iniciales y primer salto
solucion = 0;
saltocaballo (2,x,y,&solucion);
if (solucion)
{
puts("\n\tEl Problema tiene solucion:\n");
escribetablero();
}
else
puts("No se ha encontrado solución al problema\n");
putchar('\n');
system("PAUSE");
return 0;
}
void saltocaballo(int i, int x, int y, int *exito)
{
int nx, ny;
int k;
*exito = 0;
k = 0; //inicializa el conjunto de posible movimientos
do {
k++;
nx = (x + d[(k-1)][0]);
ny = (y + d[(k-1)][1]);
//determina si nuevas coordenadas son aceptables
if ((nx >= 1) &&(nx <= N) &&
(ny >= 1) && (ny <= N) &&
(tablero[nx][ny] == 0))
{
tablero[nx][ny] = i; //anota movimiento
if (i < (N*N))
{
saltocaballo((i+1), nx, ny, exito);
if (!(*exito)) //no se alcanzo solucion
{
tablero[nx][ny] = 0; //se borra anotación
}
}
else
*exito = 1; //caballo ha cunierto el tablero
}
}while ((k < 8) && !(*exito));
}
Tweet
falcatin
Miembro activo
Mensajes: 28
Re: Ayuda Salto De Caballo (recursion Infinita)
«
Respuesta #1 en:
Domingo 20 de Agosto de 2006, 13:38 »
0
Ufff pues la verdad es k no tengo muxo tiempo para mirar código, pero si te sirve de algo tuve una asignatura E.D.A. donde eso lo resolvíamos con una técnica llamada backtracking, si lo miras un pokito es fácil de aprender y muy util.
rafaeljosem
Nuevo Miembro
Mensajes: 4
Re: Ayuda Salto De Caballo (recursion Infinita)
«
Respuesta #2 en:
Domingo 20 de Agosto de 2006, 17:53 »
0
Hola, el codigo que escribi lo saque de un libro, en donde se esta tratando el tema de Backtracking, el problema es que la explicacion del libro no es muy buena (y al parecer el codigo que ellos presentan para este problema tiene errores), si podrias reconmendarme algun link en donde pueda encontrar informacion sobre backtracking, te lo agradecería.
Gracias
rafaeljosem
Nuevo Miembro
Mensajes: 4
Re: Ayuda Salto De Caballo (recursion Infinita)
«
Respuesta #3 en:
Domingo 20 de Agosto de 2006, 20:39 »
0
Ya pude resolver el problema. El codigo que habia puesto no tenia ningun error, el problema estaba en que al hacer N = 8, el programa buscaba la solucion dentro de un numero muy grande de combinaciones, por lo que demoraba demasiado tiempo. Me di cuenta al copiar otro codigo que encontre en internet, y me hacia lo mismo, asi que hice N = 5 y funciono
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Ayuda Salto De Caballo (recursion Infinita)