#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));
}