这个题解使用回溯算法来解决 N 皇后问题。基本思路是:从第一行开始,尝试在每一列放置皇后。放置之前,需要检查当前位置是否会被之前放置的皇后攻击到。如果当前位置合法,就将皇后放在当前位置,然后递归到下一行继续放置皇后。如果当前行的所有列都尝试完毕,就回溯到上一行,将上一行的皇后挪到下一列,然后继续尝试。当所有行都放置了皇后,就找到了一个合法的解,将当前棋盘状态记录到答案中。
时间复杂度: O(n^n)
空间复杂度: O(n!)
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
ans = []
board = [['.']*n for _ in range(n)] # 初始化空棋盘
def is_valid(row, col):
n = len(board)
# 检查当前列是否有皇后冲突
for i in range(n):
if board[i][col] == 'Q':
return False
# 检查右上方是否有皇后冲突
for i, j in zip(range(row-1, -1, -1), range(col+1, n)):
if board[i][j] == 'Q':
return False
# 检查左上方是否有皇后冲突
for i, j in zip(range(row-1, -1, -1), range(col-1, -1, -1)):
if board[i][j] == 'Q':
return False
return True
def backtrack(i):
if i == n: # 找到一个合法解
ans.append(["".join(line) for line in board])
return
for j in range(n):
if not is_valid(i, j): # 当前位置不合法,跳过
continue
board[i][j] = 'Q' # 放置皇后
backtrack(i+1) # 递归到下一行
board[i][j] = '.' # 回溯,撤销皇后
backtrack(0) # 从第一行开始放置皇后
return ans