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.