控制台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 皇后方案数,并将其返回。