Algorithms first
N 皇后 II · 交互式算法学习
计算互不攻击的 n 皇后摆放方案数。
#52 · 回溯
N 皇后 II
N-Queens II
n = 4矩阵3 个关键状态
步骤 1放置皇后并登记三种占用。
sets updatedrow00,0
row10,1
row21,0
row31,1
推荐
列与对角线集合
时间
O(n!)空间 O(n)用三个集合 O(1) 判断列、r-c 对角线、r+c 对角线是否占用。
1function totalNQueens(n) {2 let count = 0;3 const col = new Set(),4 d1 = new Set(),5 d2 = new Set();6 7 function dfs(r) {8 if (r === n) {9 count++;10 return11 }12 for (let c = 0; c < n; c++) {13 if (col.has(c) || d1.has(r - c) || d2.has(r + c)) continue;14 col.add(c);15 d1.add(r - c);16 d2.add(r + c);17 dfs(r + 1);18 col.delete(c);19 d1.delete(r - c);20 d2.delete(r + c)21 }22 }23 dfs(0);24 return count;25}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
1class Solution {2 private int n;3 private int ans;4 private boolean[] cols = new boolean[10];5 private boolean[] dg = new boolean[20];6 private boolean[] udg = new boolean[20];7 8 public int totalNQueens(int n) {9 this.n = n;10 dfs(0);11 return ans;12 }13 14 private void dfs(int i) {15 if (i == n) {16 ++ans;17 return;18 }19 for (int j = 0; j < n; ++j) {20 int a = i + j, b = i - j + n;21 if (cols[j] || dg[a] || udg[b]) {22 continue;23 }24 cols[j] = true;25 dg[a] = true;26 udg[b] = true;27 dfs(i + 1);28 cols[j] = false;29 dg[a] = false;30 udg[b] = false;31 }32 }33}交互式算法学习
从执行步骤真正理解 LeetCode 经典 150
本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。
AlgoViz Lab
N 皇后 II · 解法对比
计算互不攻击的 n 皇后摆放方案数。
- 测试用例
n = 4- 题目分类
- 回溯
- 解法对比
- 2
棋盘逐格安全检查
逐行放皇后,每次向上检查列与两条对角线。
- 时间
O(n!)·检查 O(n)- 空间
O(n²)
列与对角线集合
用三个集合 O(1) 判断列、r-c 对角线、r+c 对角线是否占用。
- 时间
O(n!)- 空间
O(n)