/* Novacreations.net http://www.novacreations.net Cris Vil Febrero 2006 */ #include #include #include #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}}; int main() { int x,y; int solucion; int i, j; do { printf("Coordenadas 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 solucion al problema!!"); getch(); return 0; //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 posible de 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); //Se analiza si se ha completado la solución if(!(*exito)) { tablero[nx][ny]=0; //No se alcanzó la solución, se borra la anotación } } else *exito=1; //caballo ha cubierto el tablero } }while((k<8) && !(*exito)); } void escribeTablero() { int i,j; for(i=1; i<=N; i++) { for(j=1; j<=N;j++) printf("%d %c", tablero[i][j],(j < N ? ' ': '\n')); } }