#51
Hard
回溯

N-Queens

在 n x n 棋盘上放置 n 个皇后,使其互不攻击。

Backtracking

题目定位

这是经典的约束型回溯题,真正关键的是剪枝,而不是单纯递归,因为非法棋盘状态必须尽早淘汰。

关键观察

每一行真正需要维护的信息只有哪些列、主对角线和副对角线已被占用。

目标复杂度

Exponential / O(n)

这题的解法思路怎么拆

1

这是经典的约束型回溯题,真正关键的是剪枝,而不是单纯递归,因为非法棋盘状态必须尽早淘汰。

2

每一行真正需要维护的信息只有哪些列、主对角线和副对角线已被占用。

3

先把决策树结构建出来。

4

确定当前层候选集怎么生成。

参考实现

Python
# Generic pattern template
def backtrack(path):
    if complete(path):
        answer.append(path[:])
        return
    for choice in choices(path):
        if not valid(choice, path):
            continue
        path.append(choice)
        backtrack(path)
        path.pop()

常见坑点

warning

每次尝试都整张棋盘检查,而不是维护列和对角线集合。

warning

对角线索引规则写错。

高频追问

对角线集合和行列是怎样映射的?

能不能进一步用 bitmask 优化?

继续刷相关题

先把 回溯 这个模式刷成体系,再去做更难变体。

view_week回到模式页
LeetCode 51. N-Queens 题解思路 | Interview AiBox