| Bienvenida | Salto
de caballo en C
Dedicado al amigo del otro lado del charco que pedía un algoritmo recursivo en C que solucione el problema del recorrido del tablero de ajedrez siguiendo el salto del caballo y sin pisar dos veces la misma casilla. Observe el truco del tablero virtual que simplifica y evita muchos if-elses. El algoritmo puede mejorarse con técnicas heurísticas. La solución se visualiza en el siguiente Applet Java: Salto del Caballo demostrado Saludos
#include <stdio.h>
#define N_CUADROS 8
#define N_SALTOS 8
#define CIERTO 1
#define FALSO 0
static int tablero_virtual[N_CUADROS+4][N_CUADROS+4];
static int dx[N_SALTOS]={ 2, 1,-1,-2,-2,-1, 1, 2};
static int dy[N_SALTOS]={ 1, 2, 2, 1,-1,-2,-2,-1};
static void inicia_tablero(void);
void presenta_tablero(void);
static int ensaya_movimiento(int n,int x,int y);
int main(void)
{
inicia_tablero();
printf("\ncalculando, espere por favor\n");
if(ensaya_movimiento(1,2,2))
printf("Resultado:");
else
printf("No hay soluci¢n");
presenta_tablero();
return 0;
}
static void inicia_tablero(void)
{
int i,j;
for(i=0;i<N_CUADROS+4;i++) {
for(j=0;j<N_CUADROS+4;j++) {
if(i>1 && i<N_CUADROS+2 && j>1 && j<N_CUADROS+2 )
tablero_virtual[i][j]=0;
else
tablero_virtual[i][j]=-1;
}
}
}
void presenta_tablero(void)
{
int i,j;
for(i=0;i<N_CUADROS+4;i++) {
printf("\n");
for(j=0;j<N_CUADROS+4;j++) {
if(tablero_virtual[i][j]!=-1)
printf("%4d",tablero_virtual[i][j]);
}
}
return;
}
static int ensaya_movimiento(int n,int x,int y)
{
int i,u,v;
tablero_virtual[x][y]=n;
if(n==(N_CUADROS*N_CUADROS))
return CIERTO;
else {
for(i=0;i<N_SALTOS;i++) {
u=x+dx[i];
v=y+dy[i];
if(tablero_virtual[u][v]==0) {
if(ensaya_movimiento(n+1,u,v))
return CIERTO;
}
}
}
tablero_virtual[x][y]=0;
return FALSO;
}
|
© Jerónimo Quesada 1999
Los contenidos de estas páginas pueden ser reproducidos para uso didáctico individual siempre que se cite el origen y no sean objeto de actividad de intercambio comercial de ningún tipo. En cualesquiera otras condiciones la copia, transmisión o almacenamiento por cualquier medio tipográfico, fotográfico, informático, telemático u otros requiere la autorización expresa del autor. Se agradecerá la comunicación de cualquier errata así como cualquier comentario o sugerencia.