1. 程式人生 > 實用技巧 >51,N皇后

51,N皇后

from typing import List
# 這道題還是比較經典的深搜遞迴呼叫的問題。
# 只需要保證二維列表的每一行,每一列,每一對角線只有一個皇后就好了。
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
# 定義三個集合,用來保證每一行,每一列,每一對角線只有一個皇后
self.col,self.pie,self.na = set(),set(),set()
# 定義一個列表用來存放最後的結果
self.res = []
self.dfs(n,0,[])
return self.res
# 遞迴函式,n代表行的總數,row代表行,cur用來存放找到每一行的皇后位置。
def dfs(self,n,row,cur):
# 遍歷n行後,就找出所有皇后的位置了。
if row == n:
# 注意這裡不能寫成res.append(cur)
self.res.append(cur[:])
# 這一步最重要,判斷條件,用來保證每一行每一列,對角線只有一個皇后
for index in range(n):
if index in self.col or (index + row) in self.pie or (index - row) in self.na:
continue
# 找出每一行皇后的位置。
str1 = ""
for i in range(n):
if i == index :
str1 += "Q"
else:
str1 += "."
# 找到皇后位置後,需要將這一行新增到對應的集合中
cur.append(str1)
self.pie.add(index + row)
self.na.add(index - row)
self.col.add(index)
self.dfs(n,row + 1,cur)
# 注意,遍歷完之後,要將之前新增到集合中的數刪除。
self.pie.remove(index + row)
self.na.remove(index - row)
self.col.remove(index)
cur.remove(str1)

A = Solution()
print(A.solveNQueens(4))