#include <iostream>
#include <vector>
const int N = 8; // Tamaño del tablero de ajedrez
// Estructura para representar una casilla del tablero
struct Casilla {
int x;
int y;
};
// Función para verificar si una casilla está dentro del tablero
bool esValida(int x, int y) {
return (x >= 0 && x < N && y >= 0 && y < N);
}
// Función recursiva para recorrer el tablero utilizando los movimientos del caballo
void recorrerTablero(int x, int y, int movimiento, std::vector<std::vector<int>>& tablero, std::vector<Casilla>& recorrido) {
// Marcar la casilla actual como visitada
tablero[x][y] = movimiento;
recorrido.push_back({x, y});
// Verificar si se han visitado todas las casillas del tablero
if (movimiento == N * N) {
// Imprimir el recorrido
for (const auto& casilla : recorrido) {
std::cout << "(" << casilla.x << ", " << casilla.y << ") ";
}
std::cout << std::endl;
} else {
// Generar los posibles movimientos del caballo
int movimientosX[] = {2, 1, -1, -2, -2, -1, 1, 2};
int movimientosY[] = {1, 2, 2, 1, -1, -2, -2, -1};
// Intentar realizar cada movimiento
for (int i = 0; i < 8; i++) {
int nuevaX = x + movimientosX[i];
int nuevaY = y + movimientosY[i];
// Verificar si el movimiento es válido y la casilla no ha sido visitada
if (esValida(nuevaX, nuevaY) && tablero[nuevaX][nuevaY] == 0) {
recorrerTablero(nuevaX, nuevaY, movimiento + 1, tablero, recorrido);
}
}
}
// Desmarcar la casilla actual como visitada
tablero[x][y] = 0;
recorrido.pop_back();
}
int main() {
std::vector<std::vector<int>> tablero(N, std::vector<int>(N, 0)); // Inicializar el tablero con ceros
std::vector<Casilla> recorrido; // Vector para almacenar el recorrido del caballo
// Iniciar el recorrido desde la casilla (0, 0)
recorrerTablero(0, 0, 1, tablero, recorrido);
return 0;
}