JavaScript - Acertijo 8 reinas

 
Vista:

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 ajedrez
function drawChessboard() {
  const canvas = document.getElementById('chessboard');
  const ctx = canvas.getContext('2d');
  const squareSize = canvas.width / 8;
 
  // Dibuja las casillas blancas y negras del tablero
  for (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 dada
function 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 reinas
function solveEightQueens() {
  const canvas = document.getElementById('chessboard');
  const ctx = canvas.getContext('2d');
  const squareSize = canvas.width / 8;
 
  // Limpia el tablero
  ctx.clearRect(0, 0, canvas.width, canvas.height);
 
  // Dibuja el tablero
  drawChessboard();
 
  // Función para comprobar si una posición es segura para colocar una reina
  function 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 backtracking
  function 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álida
        for (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 reinas
  solveQueensBacktracking();
}
 
// Llama a la función para resolver el acertijo de las 8 reinas cuando se carga la página
window.addEventListener('load', solveEightQueens);
  </script>
</body>
</html>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder