class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
if not n: return []
chessboard = [['.'] * n for _ in range(n)]
res = []
def backtrack(n, row, chessboard):
if row == n:
temp_res = []
for temp in chessboard: # temp表示棋盘的每行。
temp_str = ''.join(temp) # 把每行都变成字符串形式。
temp_res.append(temp_str) # 把每一种结果里的N皇后放置方式加入
res.append(temp_res) # 在最终结果里加入每个结果
for col in range(0, n): # 由这一步控制列。
if isvalid(row, col, chessboard, n): # 判断是否可以放置,如果可以
chessboard[row][col] = 'Q' # 在这个位置放Q
backtrack(n, row + 1, chessboard) # 递归,由这一步来控制行。
chessboard[row][col] = '.' # 回溯
def isvalid(row, col, chessboard, n):
for i in range(0, n):
if chessboard[i][col] == 'Q': # 同一列如果有Q,不可放置。
return False
i = row - 1
j = col - 1
while i >= 0 and j >= 0: # 45°斜线上是否有Q
if chessboard[i][j] == 'Q':
return False
i -= 1
j -= 1
i = row - 1
j = col + 1
while i >= 0 and j < n: # 135°斜线上是否有Q
if chessboard[i][j] == 'Q':
return False
i -= 1
j += 1
return True # 不需要对行进行判断,因为
backtrack(n, 0, chessboard) # 递归
return res