解题思路
通过row的变化这一点,遍历树的深度的时候,索引变量是row,这里比较难想到
还有就是一般在终止条件if那里去剪枝,此题在回溯函数中就已经剪枝
‘’.join(i) for i in chessboard,通过这里来去掉引号,学到一招
其他和整体和回溯法的通解挺像的
代码有很多print帮助自己理解一些用法
class Solution:
def __init__(self):
self.res = []
def solveNQueens(self, n: int):
self.chessboard = [["." for _ in range(n)] for _ in range(n)]
# print(self.chessboard) # test code
self.backtrack(0, n, self.chessboard)
return self.res
def isvalid(self, row, col, n, chessboard):
# 每层遍历,行自然不重复.1.检查列
for i in range(row):
if chessboard[i][col] == 'Q':
return False
# 2.检查主对角线,行减法列加法,查看右上方是否有Q
for i, j in zip(range(row - 1, -1, -1), range(col + 1, n, 1)):
if chessboard[i][j] == 'Q':
return False
# 3.检查次对角线
# 查看左上方是否有Q,行减法列减法
for i, j in zip(range(row - 1, -1, -1), range(col - 1, -1, -1)):
if chessboard[i][j] == 'Q':
return False
return True
def backtrack(self, row, n, chessboard):
if row == n:
# print(f"this is chessboard:{chessboard}") # test code
# tmp暂时存储整个棋盘,并且去掉每个引号
tmp = [''.join(i)for i in chessboard]
# print(f"this is tmp:{tmp}") # test code
self.res.append(tmp)
return
for col in range(n):
if self.isvalid(row, col, n, chessboard):
chessboard[row][col] = 'Q'
self.backtrack(row + 1, n, chessboard)
chessboard[row][col] = '.'
return self.res