jueves, 13 de agosto de 2015

El salto del caballo en java , backtracking

Codigo aqui

Clase CaballoSaltador
*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package CaballoSaltador;

/**
 *
 * @author SaruraiTensai
 */
public class CaballoSaltador {

    static final int N = 8;
    static final int n = (N + 1);
    private int[][] tablero = new int[n][n];
    private boolean exito;
    private int[][] SALTO = {{2, 1}, {1, 2}, {-1, 2}, {-2, 1},
    {-2, -1}, {-1, -2}, {1, -2}, {2, -1}};
    private int x0, y0;
// constructor

    public CaballoSaltador(int x, int y) throws Exception {
        if ((x < 1) || (x > N)
                || (y < 1) || (y > N)) {
            throw new Exception("Coordenadas fuera de rango");
        }
        x0 = x;
        y0 = y;
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                tablero[i][j] = 0;
            }
        }
        tablero[x0][y0] = 1;
        exito = false;
    }

    public boolean resolverProblema() {
        saltoCaballo(x0, y0, 2);
        return exito;
    }

    private void saltoCaballo(int x, int y, int i) {
        int nx, ny;
        int k;
        k = 0; // inicializa el conjunto de posibles movimientos
        do {
            k++;
            nx = x + SALTO[k - 1][0];
            ny = y + SALTO[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(nx, ny, i + 1);
// se analiza si se ha completado la solución
                    if (!exito) { // no se alcanzó la solución
                        tablero[nx][ny] = 0; // se borra anotación
                    }
                } else {
                    exito = true; // tablero cubierto
                }
            }
        } while ((k < 8) && !exito);
    }
//muestra por pantalla los pasos del caballo

    void escribirTablero() {
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                System.out.print(tablero[i][j] + " ");
            }
            System.out.println();
        }
    }
}
............................................................................................................................................
Metodo Main
package CaballoSaltador;

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 *
 * @author SaruraiTensai
 */
public class VueltaAtras {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int x, y;
        boolean solucion;
        BufferedReader entrada = new BufferedReader(
                new InputStreamReader(System.in));
        try {
            System.out.println("Posicion inicial del caballo. ");
            System.out.print(" x = ");
            x = Integer.parseInt(entrada.readLine());
            System.out.print(" y = ");
            y = Integer.parseInt(entrada.readLine());
            CaballoSaltador miCaballo = new CaballoSaltador(x, y);
            solucion = miCaballo.resolverProblema();
            if (solucion) {
                miCaballo.escribirTablero();
            }
        } catch (Exception m) {
            System.out.println("No se pudo probar el algoritmo, " + m);
        }
    }

}


Corrida

Este es el cuadro 8*8, esta enumerada con el numero de salto del caballo  hasta recorrer toda la tabla.

5 comentarios:

  1. ¿Por que funciona para tableros con un tamaño de 5x5, 6x6... hasta 8x8, pero no para tableros de más casillas?

    ResponderEliminar
    Respuestas
    1. Porque static final int N=8 es la que utiliza en bucles si es menor funciona si lo quieres usar en un tablero mayor cambia el valor por uno del tamaño de tu tablero

      Eliminar
    2. Porque static final int N=8 es la que utiliza en bucles si es menor funciona si lo quieres usar en un tablero mayor cambia el valor por uno del tamaño de tu tablero

      Eliminar
  2. sirve para cualquier coordenada o solo la 1,1?

    ResponderEliminar
  3. Creo no corre si es una coordenada diferente a 1,1

    ResponderEliminar