Algorithms first

N 皇后 II · 交互式算法学习

计算互不攻击的 n 皇后摆放方案数。

#52 · 回溯

N 皇后 II

N-Queens II

测试用例n = 4
矩阵3 个关键状态
步骤 1放置皇后并登记三种占用。sets updated
row00,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}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

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 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
AlgoViz Lab

N 皇后 II · 解法对比

计算互不攻击的 n 皇后摆放方案数。

测试用例
n = 4
题目分类
回溯
解法对比
2
方案 1

棋盘逐格安全检查

逐行放皇后,每次向上检查列与两条对角线。

时间
O(n!)·检查 O(n)
空间
O(n²)
方案 2

列与对角线集合

用三个集合 O(1) 判断列、r-c 对角线、r+c 对角线是否占用。

时间
O(n!)
空间
O(n)