├── .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 |
--------------------------------------------------------------------------------