├── .gitignore ├── .idea ├── .gitignore ├── misc.xml └── modules.xml ├── caballito.iml └── src └── Main.java /.gitignore: -------------------------------------------------------------------------------- 1 | ### IntelliJ IDEA ### 2 | out/ 3 | !**/src/main/**/out/ 4 | !**/src/test/**/out/ 5 | 6 | ### Eclipse ### 7 | .apt_generated 8 | .classpath 9 | .factorypath 10 | .project 11 | .settings 12 | .springBeans 13 | .sts4-cache 14 | bin/ 15 | !**/src/main/**/bin/ 16 | !**/src/test/**/bin/ 17 | 18 | ### NetBeans ### 19 | /nbproject/private/ 20 | /nbbuild/ 21 | /dist/ 22 | /nbdist/ 23 | /.nb-gradle/ 24 | 25 | ### VS Code ### 26 | .vscode/ 27 | 28 | ### Mac OS ### 29 | .DS_Store -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /caballito.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/Main.java: -------------------------------------------------------------------------------- 1 | import java.util.ArrayList; 2 | 3 | public class Main { 4 | static String tablero[][] = new String[8][8]; 5 | static char cols[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; 6 | static int movs[][] = {{2, -1}, {2, 1}, {1, -2}, {1, 2}, {-1, -2}, {-1, 2}, {-2, -1}, {-2, 1}}; 7 | static String casillas[] = new String[64]; 8 | static boolean visited[][] = new boolean[8][8]; // Matriz para rastrear las posiciones visitadas 9 | 10 | public static void main(String[] args) { 11 | int posi = (int) (Math.random() * 64); // Generar un número aleatorio entre 0 y 63 12 | int fila = 8 - (posi / 8); // Calcular la fila inicial 13 | char columna = cols[posi % 8]; // Calcular la columna inicial 14 | String posIni = "" + columna + fila; // Concatenar la columna y la fila 15 | System.out.println("Posición Inicial del caballo: " + posIni); 16 | casillas[posi] = "♘"; 17 | 18 | int posf = (int) (Math.random() * 64); // Generar un número aleatorio entre 0 y 63 19 | fila = 8 - (posf / 8); // Calcular la fila inicial 20 | columna = cols[posf % 8]; // Calcular la columna inicial 21 | String posFin = "" + columna + fila; // Concatenar la columna y la fila 22 | System.out.println("Posición de Destino del caballo: " + posFin); 23 | casillas[posf] = "♔"; 24 | 25 | int mina1 = (int) (Math.random() * 64); // Generar un número aleatorio entre 0 y 63 26 | casillas[mina1] = "® "; 27 | int mina2 = (int) (Math.random() * 64); // Generar un número aleatorio entre 0 y 63 28 | casillas[mina2] = "® "; 29 | int mina3 = (int) (Math.random() * 64); // Generar un número aleatorio entre 0 y 63 30 | casillas[mina3] = "® "; 31 | System.out.println(); 32 | printTableroInicial(); 33 | System.out.println(); 34 | 35 | // Inicializar la matriz visited 36 | for (int i = 0; i < 8; i++) { 37 | for (int j = 0; j < 8; j++) { 38 | visited[i][j] = false; 39 | } 40 | } 41 | 42 | ArrayList ruta = rutaSegura(posIni, posFin); 43 | System.out.println("Ruta segura del caballo:"); 44 | for (String movimiento : ruta) { 45 | System.out.print(movimiento + ","); 46 | } 47 | } 48 | 49 | static void printTableroInicial() { 50 | int index = 0; 51 | int numfila = 8; 52 | for (int i = 7; i >= 0; i--) { 53 | for (int j = 0; j < tablero[i].length; j++) { 54 | System.out.print("|" + cols[j] + "" + (numfila)); 55 | tablero[i][j] = (cols[j] + "" + (numfila)); 56 | casillas[index] = (casillas[index] == null ? tablero[i][j] : casillas[index]);//lenamos el vector 57 | index++; 58 | } 59 | numfila--; 60 | 61 | System.out.println(); 62 | 63 | } 64 | System.out.println(); 65 | //for (String casilla : casillas) 66 | //System.out.print(casilla); 67 | System.out.println(); 68 | 69 | //imprimimos de nuevo el tablero con las minas y las posiciónes 70 | numfila = 8; 71 | index = 0; 72 | for (int i = 7; i >= 0; i--) { 73 | for (int j = 0; j < tablero[i].length; j++) { 74 | tablero[i][j] = (casillas[index]); 75 | System.out.print(tablero[i][j] + "|"); 76 | index++; 77 | } 78 | numfila--; 79 | 80 | System.out.println(); 81 | } 82 | } 83 | 84 | static boolean verifiCoords(int fila, int columna) { 85 | return fila >= 0 && fila < 8 && columna >= 0 && columna < 8; 86 | } 87 | 88 | static ArrayList rutaSegura(String posIni, String posFin) { 89 | ArrayList ruta = new ArrayList<>(); 90 | int filaIni = 8 - (Character.getNumericValue(posIni.charAt(1))); // Obtener fila inicial 91 | int columnaIni = getIndex(cols, posIni.charAt(0)); // Obtener columna inicial 92 | int filaFin = 8 - (Character.getNumericValue(posFin.charAt(1))); // Obtener fila final 93 | int columnaFin = getIndex(cols, posFin.charAt(0)); // Obtener columna final 94 | 95 | // Añadir posición inicial a la ruta 96 | ruta.add(posIni); 97 | 98 | // Realizar movimientos hasta llegar a la posición final 99 | dfs(filaIni, columnaIni, filaFin, columnaFin, ruta); 100 | 101 | return ruta; 102 | } 103 | 104 | static void dfs(int filaIni, int columnaIni, int filaFin, int columnaFin, ArrayList ruta) { 105 | // Si hemos llegado a la posición final, detener la búsqueda 106 | if (filaIni == filaFin && columnaIni == columnaFin) { 107 | return; 108 | } 109 | 110 | // Marcar la celda actual como visitada 111 | visited[filaIni][columnaIni] = true; 112 | 113 | // Explorar todas las posibles direcciones de movimiento 114 | for (int[] mov : movs) { 115 | int newFila = filaIni + mov[0]; 116 | int newColumna = columnaIni + mov[1]; 117 | 118 | // Si la nueva posición es válida, no es una mina y no ha sido visitada, moverse a ella y continuar la búsqueda 119 | if (verifiCoords(newFila, newColumna) && !esMina(newFila, newColumna) && !visited[newFila][newColumna]) { 120 | ruta.add("" + cols[newColumna] + (8 - newFila)); 121 | dfs(newFila, newColumna, filaFin, columnaFin, ruta); 122 | 123 | // Si hemos llegado a la posición final, detener la búsqueda 124 | if (ruta.get(ruta.size() - 1).equals("" + cols[columnaFin] + (8 - filaFin))) { 125 | return; 126 | } 127 | 128 | // Si la ruta actual no lleva a la posición final, retroceder y explorar otras direcciones 129 | ruta.remove(ruta.size() - 1); 130 | } 131 | } 132 | 133 | // Desmarcar la celda actual como visitada antes de retroceder 134 | visited[filaIni][columnaIni] = false; 135 | } 136 | 137 | static boolean esMina(int fila, int columna) { 138 | int index = (8 - fila) * 8 + getColumnIndex(cols[columna]); 139 | return index >= 0 && index < 64 && casillas[index].equals("® "); 140 | } 141 | 142 | static int getIndex(char[] arr, char target) { 143 | for (int i = 0; i < arr.length; i++) { 144 | if (arr[i] == target) { 145 | return i; 146 | } 147 | } 148 | return -1; 149 | } 150 | 151 | static int getColumnIndex(char columna) { 152 | for (int i = 0; i < cols.length; i++) { 153 | if (cols[i] == columna) { 154 | return i; 155 | } 156 | } 157 | return -1; 158 | } 159 | } 160 | --------------------------------------------------------------------------------