8皇后问题(JavaScript)

       控制台log输出为何频频失踪?
  wxss代码为何频频失效?
  wxml布局为何乱作一团?
  究竟是道德的沦丧?还是人性的缺失?
  让我们一起来 走 跑进科学


前言

国际象棋的棋盘可以看做是一个 8 * 8 的矩阵,上面每一个格子仅能放一枚棋子,现在给出一个 8*8 的由 0 和 1组成的矩阵,代表象棋棋盘,1 代表当前位置放置了一个皇后,0 则代表什么都没有放,上面有 n (n 为小于 8 的正整数)个位置已经放上了皇后棋子(相互之间不冲突,合理摆放)现在另外给你 8 - n 个皇后,问你有多少合理的摆法


正文

这是一个典型的 N 皇后问题,解法可以采用回溯法。

首先,我们可以从第 n+1 行开始,依次尝试将皇后放到每一个位置上。对于每个位置,我们需要判断是否与前面的皇后产生冲突,即是否在同一行、同一列或同一对角线上。

如果该位置没有冲突,我们可以将皇后放置在该位置,并继续递归地处理下一行。如果放置成功,我们就将当前行的皇后数量加一。

如果当前行的皇后数量已经为 8,说明我们已经成功地放置了 8 个皇后,这时可以将当前合法的方案数加一,并且撤回当前行的皇后,继续考虑当前行的下一个位置。

如果当前行的皇后数量小于 8,说明还需要在下一行放置皇后,我们可以递归地处理下一行,直到最后一行。如果最后没有找到合法的方案,则需要撤回当前行的皇后,继续考虑当前行的下一个位置。

最终,我们可以得到所有合法的 N 皇后方案数。

上代码

function nQueens(board) {
  const is_valid = (row, col, queens) => {
    for (let i = 0; i < row; i++) {
      const [r, c] = [i, queens[i]];
      if (c === col || r + c === row + col || r - c === row - col) {
        return false;
      }
    }
    return true;
  };

  const backtrack = (row, queens) => {
    if (row === 8) {
      count++;
      return;
    }
    for (let col = 0; col < 8; col++) {
      if (is_valid(row, col, queens)) {
        queens.push(col);
        backtrack(row + 1, queens);
        queens.pop();
      }
    }
  };

  let count = 0;
  const queens = board.map(row => row.indexOf(1));
  backtrack(queens.length, queens);
  return count;
}

const board = [
  [1, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 1, 0],
  [0, 0, 0, 0, 1, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 0, 1],
  [0, 1, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 1, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 1, 0, 0],
  [0, 0, 1, 0, 0, 0, 0, 0],
];
const count = nQueens(board);
console.log(count);  // 输出合法方案数

总结

is_valid 函数中,我们使用了一个循环来遍历之前已经放置的皇后,判断当前位置是否与之前的皇后产生冲突。在 backtrack 函数中,我们从第 row 行开始尝试放置皇后,对于每个位置,如果没有冲突,则递归地处理下一行。如果当前行的皇后数量已经为 8,则说明找到了一种合法的方案,这时将方案数加一并撤回当前行的皇后。最终,我们可以得到所有合法的 N 皇后方案数,并将其返回。

扫描二维码关注公众号,回复: 15202216 查看本文章

猜你喜欢

转载自blog.csdn.net/m0_66016308/article/details/129681479
今日推荐