题目
n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。
示例 1:
输入:n = 4
输出:2
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:1
提示:
- 1 <= n <= 9
答案
设计一个函数 dfs(i),表示从第 i 行开始搜索,搜索到的结果累加到答案中。
在第 i 行,我们枚举第 i 行的每一列,如果当前列不与前面已经放置的皇后发生冲突,那么我们就可以放置一个皇后,然后继续搜索下一行,即调用 dfs(i+1)。
如果发生冲突,那么我们就跳过当前列,继续枚举下一列。
判断是否发生冲突,我们需要用三个数组分别记录每一列、每一条正对角线、每一条反对角线是否已经放置了皇后。
具体地,我们用 cols 数组记录每一列是否已经放置了皇后,用 dg 数组记录每一条正对角线是否已经放置了皇后,用 udg 数组记录每一条反对角线是否已经放置了皇后。
时间复杂度 O(n!),空间复杂度 O(n)。其中 n 是皇后的数量。
class Solution(object):
def totalNQueens(self, n):
"""
:type n: int
:rtype: int
"""
self.ans = 0
def place(i, vert, ldiag, rdiag):
if i == n: self.ans += 1
else:
for j in range(n):
vmask, lmask, rmask = 1 << j, 1 << (i+j), 1 << (n-i-1+j)
if vert & vmask or ldiag & lmask or rdiag & rmask: continue
place(i+1, vert | vmask, ldiag | lmask, rdiag | rmask)
place(0,0,0,0)
return self.ans