51. N-Queens
![17368230-8cdea481336cce30.png](https://i-blog.csdnimg.cn/blog_migrate/3812b84a393f024fc34802a272fe0e9e.webp?x-image-process=image/format,png)
![17368230-bbe3be00a8432c08.png](https://i-blog.csdnimg.cn/blog_migrate/3f0b16e6e58de20d12bff3814d0eb91a.webp?x-image-process=image/format,png)
51. N-Queens
把n个皇后放入n*n的网格中,每行,每列,对角都不能相邻。用3个数组记录,每次检查是否在集合中。
可以从每行入手,如果行数到n就加入res
每行从1-n开始检测,如果当前位置可以就继续下一行,如果都不可以就要回溯。
代码如下:
class Solution(object):
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
trace = []
res = []
flag_col = [False for i in range(n)]
flag_45 = [False for i in range(2*n-1)]
flag_135 = [False for i in range(2*n-1)]
self.DFS(n, 0, trace, res, flag_col, flag_45, flag_135)
return res
def DFS(self, n, k, trace, res, flag_col, flag_45, flag_135):
if k == n:
res.append(trace[:])
return
for i in range(n):
if not flag_col[i] and not flag_45[n-1+k-i] and not flag_135[k+i]:
temp = '.' * i + 'Q' + '.' * (n - i - 1)
flag_col[i] = True
flag_45[n - 1 + k - i] = True
flag_135[k + i] = True
trace.append(temp)
self.DFS(n, k+1, trace, res, flag_col, flag_45, flag_135)
trace.pop()
flag_col[i] = False
flag_45[n - 1 + k - i] = False
flag_135[k + i] = False
52. N-Queens II
![17368230-e82f1731e5adfb3d.png](https://i-blog.csdnimg.cn/blog_migrate/63ab7e9779992416a8da4a46dcacff41.webp?x-image-process=image/format,png)
52. N-Queens II
和上题一样了啦,明天再写一遍,看能一次AC不~
代码如下:
class Solution(object):
def totalNQueens(self, n):
"""
:type n: int
:rtype: int
"""
self.res = 0
flag_col = [False] * n
flag_45 = [False] * (2*n-1)
flag_135 = [False] * (2*n-1)
trace = []
self.DFS(n, trace, flag_col, flag_45, flag_135, 0)
return self.res
def DFS(self, n, trace, flag_col, flag_45, flag_135, k):
if k == n:
self.res += 1
return
for i in range(n):
if flag_col[i]==False and flag_45[i+k]==False and flag_135[n-1+i-k]==False:
temp = '.' * i + 'Q' + '.' * (n - 1 - i)
trace.append(temp)
flag_col[i] = True
flag_45[i+k] = True
flag_135[n-1+i-k] = True
self.DFS(n, trace, flag_col, flag_45, flag_135, k+1)
trace.pop()
flag_col[i] = False
flag_45[i+k] = False
flag_135[n-1+i-k] = False