题目描述:
思路:
(1)初始化棋盘
(2)从上到下,逐行开始尝试
(3)尝试棋盘中每行的每一个位置,如果放置之后发生“冲突”(前面行中放置的皇后,和该位置在同一行、同一列或者同一对角线上),则进行剪枝
(4)如果没有发生“冲突”,则处理该位置(用"Q"覆盖"."),进入下一行的递归
(5)回溯,回到上一行
代码和注释:
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
# 初始化棋盘
board = [['.'] * n for _ in range(n)]
res = []
# 表示board中小于row的那些行(row上面的那些行)已经放置皇后了
# 这一步开始往第row行放皇后
def backtrack(row):
n = len(board)
# 如果到最后一行了,则将结果添加到res里
if row == n:
tmp = [''.join(i) for i in board]
res.append(tmp)
return
for col in range(n):
if not self.isValid(board, row, col):
continue
# 该处放置皇后
board[row][col] = 'Q'
# 递归
backtrack(row + 1)
# 回溯
board[row][col] = '.'
# 调用
backtrack(0)
return res
# 查看是否可以在board[row][col]的位置放置皇后
def isValid(self, board, row, col):
n = len(board)
# 查看上方是否有Q
for i in range(row):
if board[i][col] == 'Q':
return False
# 查看右上方是否有Q
for i, j in zip(range(row - 1, -1, -1), range(col + 1, n, 1)):
if board[i][j] == 'Q':
return False
# 查看左上方是否有Q
for i, j in zip(range(row - 1, -1, -1), range(col - 1, -1, -1)):
if board[i][j] == 'Q':
return False
return True