题目描述
思路解析动画文字版
N=8 时光「16 选 8」就上亿种摆法,绝大多数一眼就违规,全枚举出来再筛根本扛不住。
转折:既然每行必有且只有一个皇后,那就一行行来,把「选 N 个格子」变成「每行选一列」。在第 r 行放之前,先看这列、这两条对角线有没有被占——没占才放,撞了就跳过,整行都放不下就回退上一行。
逐行放,所以不用查行。只需查三样:同一列、主对角线(行−列 相同)、副对角线(行+列 相同)。三个集合 O(1) 判定。
第 0 行 · 试 (0,0):先在第 0 行第 0 列放一个皇后(试探态),记下 列0、主对角线 0−0、副对角线 0+0 被占,试试这条路走不走得通。
第 1 行 · 前两列被攻击:进到第 1 行从左往右试:(1,0) 和上面的皇后同列、(1,1) 在主对角线上(行差1=列差1),都被攻击(红格),跳过。
第 1 行 · 落子 (1,2):继续到 (1,2):列 2 没占、两条对角线也没占 → 安全,放下。记列2、对角线 1−2、1+2 被占,再下探第 2 行。
第 2 行 · 无处可放:负例分支:第 2 行每个格子都被前两个皇后的列或斜线盯上——(2,0)同列、(2,1)在(1,2)的副对角线、(2,2)同列、(2,3)在(1,2)的主对角线。整行没安全列,这条路死了,回溯。
(1,2) 走死 → 改试 (1,3),仍走死:(0,0) 开局的两个落点(列2、列3)往下都走死——不是 (1,3) 被攻击,是它的子树没有解。
退回第 0 行 · 换 (0,1):(0,0) 这一整支开局失败,回到第 0 行换下一列 (0,1) 重新尝试。
第 1 行 · 推进到 (1,3):新开局后第 1 行试列:列1同列、(1,0)和(1,2)分别在 (0,1) 的两条对角线上,只有 (1,3) 安全 → 放下,继续下探。
顺下来了 · 一个完整解:接着第 2 行只剩 (2,0)、第 3 行只剩 (3,2),r 推到 4(== n) → 四个皇后互不攻击,第一个解到手。继续回溯还能找到它的镜像,凑齐 2 个解。
约束类回溯的范本:把限制(同列/对角线)变成 O(1) 的剪枝,逐行推进,死路立刻回退。
边界三连:本题真边界:n=1、n=2/3 无解、n=4。
面试官常追问:三个高频追问,回溯+对角线编码必背。
参考代码
class Solution: def solveNQueens(self, n): ans = [] board = [["."]*n for _ in range(n)] cols, d1, d2 = set(), set(), set() # d1=r-c(↘), d2=r+c(↙) def backtrack(r): if r == n: ans.append(["".join(row) for row in board]); return for c in range(n): if c in cols or (r-c) in d1 or (r+c) in d2: continue # 列/两对角线 冲突则跳过 board[r][c] = "Q" cols.add(c); d1.add(r-c); d2.add(r+c) backtrack(r + 1) # 放下,进下一行 board[r][c] = "." # 撤销,换下一列 cols.discard(c); d1.discard(r-c); d2.discard(r+c) backtrack(0) return ans复杂度
- 时间复杂度:O(N!),第 r 行最多剩 N−r 个安全列,层层相乘逼近 N!,但剪枝砍掉大量死分支
- 空间复杂度:O(N),三个集合各至多 N 项 + 递归栈深 N + 棋盘 N×N(可压成一维)
可套用的代码模板
逐行递归、冲突就 continue、放下记占用、回溯清占用。对角线用 r−c 和 r+c 编号,是这题最妙的一笔。
Python
def bt(r): if r == n: 收集一个解; return for c in range(n): if 冲突(r, c): continue 放下(r, c) + 记录占用 bt(r + 1) 撤回(r, c) + 清除占用易错点
面试追问把动画讲成自己的话
追问核心思路是什么?
追问为什么复杂度是 O(N!)?
追问如果只要解的「个数」(LC52 N 皇后 II)怎么改?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
解数独
LeetCode 37 · 困难 · 沿着 回溯 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题