解题思路
使用深度优先搜索,按行搜索。如果下一行搜索不到合法的路径,则相关参数回退到上一层,并尝试更新y之后再次搜索。
伪代码如下:
res=[] # 用于存储最终结果
def dfs(n,x,arr,cols,diag1,diag2):
if x==n:
res.append(arr)
else:
# 对于每一行x,循环搜索不同的列y值
for y in range(n):
if check(x,y)合法:
# 更新合法性判断参数
# 更新arr,cols,diag1,diag2等参数
dfs(n,x+1,arr,cols,diag1,diag2)
# 还原arr,cols,diag1,diag2等参数
else:
continue
dfs(n,0,[],set(),set(),set())
代码
class Solution(object):
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
# 全局变量res用于记录最终结果
res=[]
# n表示矩阵的边长,x表示当前搜索到的行,m表示当前已生成的矩阵
# cols、diag1、diag2均用于判断矩阵的合法性,cols表示已经占据列,diag1、diag2用于表示已占据的左下斜边和右下斜边
cols,diag1,diag2=set(),set(),set()
def dfs(x,m,cols,diag1,diag2):
# 搜索到第n行时表示搜索结束
if x==n:
res.append(m)
else:
# 对于任意一个x行,要搜索n列
for y in range(n):
# 如果(x,y)合法,更新相关参数,继续搜索下一行
if (y not in cols) and (x+y not in diag1) and (x-y not in diag2):
cols.add(y)
diag1.add(x+y)
diag2.add(x-y)
m=m+[''.join(['Q' if i==y else '.' for i in range(n)])]
dfs(x+1,m,cols,diag1,diag2)
# 如果x+1层的搜索都不合法,参数需要进行还原,以便在对y进行循环时保持判别参数的有效性
cols.remove(y)
diag1.remove(x+y)
diag2.remove(x-y)
m=m[:-1]
# 如果(x,y)不合法,则continue,搜索下一列
else:
continue
dfs(0,[],set(),set(),set())
return res