问题描述:在 n×n 的棋盘上放置 n 个皇后,使得它们不能互相攻击。即任意两个皇后不能在同一行、同一列或同一对角线上
实现步骤:
- 从第一行开始,尝试在每一列放置皇后
- 对于每个位置,检查当前放置是否会导致冲突
- 如果不冲突,则继续在下一行放置皇后
- 如果冲突或所有列都尝试过,则回退到上一步,尝试其他位置
分析:
- 时间复杂度: O(n!),因为需要尝试所有可能的放置方式
- 空间复杂度: O(n2),因为需要存储棋盘和解决方案
实现代码
function solveNQueens(n) {
const solutions = [];
const board = Array.from({ length: n }, () => Array(n).fill('.'));
function isSafe(row, col) {
for (let i = 0; i < row; i++) {
if (board[i][col] === 'Q') return false;
}
for (let i = row, j = col; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] === 'Q') return false;
}
for (let i = row, j = col; i >= 0 && j < n; i--, j++) {
if (board[i][j] === 'Q') return false;
}
return true;
}
function backtrack(row) {
if (row === n) {
solutions.push(board.map(r => r.join('')));
return;
}
for (let col = 0; col < n; col++) {
if (isSafe(row, col)) {
board[row][col] = 'Q';
backtrack(row + 1);
board[row][col] = '.';
}
}
}
backtrack(0);
return solutions;
}
console.log(solveNQueens(4)); // 输出: 所有4皇后的解法