当前位置: 面试刷题>> N 皇后 II(经典算法150题)


### 题目描述 **N 皇后 II** 是 N 皇后问题的一个变种,该问题是国际象棋中的一个经典问题。在 N×N 的棋盘上要摆放 N 个皇后,使得它们互不攻击。皇后能攻击同一行、同一列或同一对角线上的其他皇后。给定一个整数 N,返回在 N×N 棋盘上摆放 N 个皇后的不同解决方案的数量。 ### 示例 - 输入: 4 - 输出: 2 - 解决方案示例: ``` [ [".Q..", "...Q", "Q...", "..Q."], ["..Q.", "Q...", "...Q", ".Q.."] ] ``` 注意:这里的输出仅为了说明问题,而实际题目要求返回的是解决方案的数量,即 2。 ### PHP 示例代码 ```php = 0 && $j >= 0; $i--, $j--) { if ($board[$i][$j] == 'Q') { return false; } } // 检查右上对角线 for ($i = $row - 1, $j = $col + 1; $i >= 0 && $j < $n; $i--, $j++) { if ($board[$i][$j] == 'Q') { return false; } } return true; } // 示例调用 echo solveNQueens(4); // 输出 2 ?> ``` ### Python 示例代码 ```python def solveNQueens(n): def backtrack(row, cols, pie, na, count): if row == n: count[0] += 1 return for col in range(n): if col in cols or row - col in pie or row + col in na: continue cols.add(col) pie.add(row - col) na.add(row + col) backtrack(row + 1, cols, pie, na, count) cols.remove(col) pie.remove(row - col) na.remove(row + col) count = [0] backtrack(0, set(), set(), set(), count) return count[0] # 示例调用 print(solveNQueens(4)) # 输出 2 ``` ### JavaScript 示例代码 ```javascript function solveNQueens(n) { let count = 0; function backtrack(row, cols, pie, na) { if (row === n) { count++; return; } for (let col = 0; col < n; col++) { if (cols.has(col) || pie.has(row - col) || na.has(row + col)) { continue; } cols.add(col); pie.add(row - col); na.add(row + col); backtrack(row + 1, cols, pie, na); cols.delete(col); pie.delete(row - col); na.delete(row + col); } } const cols = new Set(); const pie = new Set(); // 主对角线 const na = new Set(); // 副对角线 backtrack(0, cols, pie, na); return count; } // 示例调用 console.log(solveNQueens(4)); // 输出 2 ``` 以上代码分别用 PHP、Python 和 JavaScript 实现了 N 皇后 II 问题的解决方案,通过回溯算法计算出了在 N×N 棋盘上摆放 N 个皇后的不同解决方案的数量。
推荐面试题