Acertijo 8 reinas
Publicado por Carlos Ocampo (1 intervención) el 29/05/2023 04:12:32
Tengo que realizar en acertijo de las 8 reinas en un tablero de ajedrez y cada vez que se recargue la página debe mostrar una solución diferente. Sin embargo, tengo un problema con esto último siempre me da la misma solución. Alguna idea de como resolverlo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<!DOCTYPE html>
<html>
<head>
<title>Acertijo de las 8 Reinas</title>
</head>
<body>
<canvas id="chessboard" width="400" height="400"></canvas>
<script>
// Función para dibujar el tablero de ajedrezfunction drawChessboard() {
const canvas = document.getElementById('chessboard');
const ctx = canvas.getContext('2d');
const squareSize = canvas.width / 8;
// Dibuja las casillas blancas y negras del tablerofor (let row = 0; row < 8; row++) {
for (let col = 0; col < 8; col++) {
if ((row + col) % 2 === 0) {
ctx.fillStyle = '#FFF';
} else {
ctx.fillStyle = '#000';
}ctx.fillRect(col * squareSize, row * squareSize, squareSize, squareSize);
} }}// Función para dibujar una reina en una posición dadafunction drawQueen(ctx, row, col, squareSize) {
const queenImg = document.createElement('img');
queenImg.src = 'queen.png'; // Imagen de la reina (ajusta la ruta según la ubicación de tu imagen)
queenImg.onload = function () {
ctx.drawImage(queenImg, col * squareSize, row * squareSize, squareSize, squareSize);
};}// Función para resolver el acertijo de las 8 reinasfunction solveEightQueens() {
const canvas = document.getElementById('chessboard');
const ctx = canvas.getContext('2d');
const squareSize = canvas.width / 8;
// Limpia el tableroctx.clearRect(0, 0, canvas.width, canvas.height);
// Dibuja el tablerodrawChessboard();
// Función para comprobar si una posición es segura para colocar una reinafunction isSafe(row, col, queens) {
for (let i = 0; i < row; i++) {
if (queens[i] === col ||
queens[i] - i === col - row ||
queens[i] + i === col + row
) {
return false;
} }return true;
} // Resuelve el acertijo de las 8 reinas utilizando backtrackingfunction solveQueensBacktracking() {
function generateRandomSolution() {
const queens = [];
const availableCols = [0, 1, 2, 3, 4, 5, 6, 7];
for (let row = 0; row < 8; row++) {
const randomIndex = Math.floor(Math.random() * availableCols.length);
queens.push(availableCols[randomIndex]);
availableCols.splice(randomIndex, 1);
}return queens;
}const queens = generateRandomSolution();
function backtrack(row) {
if (row === 8) {
// Se ha encontrado una solución válidafor (let i = 0; i < 8; i++) {
drawQueen(ctx, i, queens[i], squareSize);
}return true;
}for (let col = 0; col < 8; col++) {
if (isSafe(row, col, queens)) {
queens[row] = col;
if (backtrack(row + 1)) {
return true;
} } }return false;
}backtrack(0);
} // Llama a la función para resolver el acertijo de las 8 reinassolveQueensBacktracking();
}// Llama a la función para resolver el acertijo de las 8 reinas cuando se carga la páginawindow.addEventListener('load', solveEightQueens);
</script>
</body>
</html>
Valora esta pregunta


0