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