题目:
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
解答:
方法一:回溯
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
def isValid(row,col,n,chessboard):
#检查列
for i in range(row):
if chessboard[i][col]=='Q':
return False
#检查正斜线(135°)
i=row-1
j=col-1
while i>=0 and j>=0:
if chessboard[i][j]=='Q':
return False
i-=1
j-=1
#检查负斜线(45°)
i=row-1
j=col+1
while i>=0 and j<=n-1:
if chessboard[i][j]=='Q':
return False
i-=1
j+=1
return True #满足要求
def tracebacking(n,row,chessboard):
if row==n:
tmp=[]
for cur in chessboard:
tmp.append(''.join(cur))
res.append(tmp)
return
for col in range(n): #在同层展开
if isValid(row,col,n,chessboard):
chessboard[row][col]='Q'
tracebacking(n,row+1,chessboard) #递归:在深度上展开
chessboard[row][col]='.'
res=[]
chessboard=[['.']*n for _ in range(n)]
tracebacking(n,0,chessboard)
return res