res=
# 用於儲存最終結果
defdfs
(n,x,arr,cols,diag1,diag2)
:if x==n:
else
:# 對於每一行x,迴圈搜尋不同的列y值
for y in
range
(n):
if check(x,y)合法:
# 更新合法性判斷引數
# 更新arr,cols,diag1,diag2等引數
dfs(n,x+
1,arr,cols,diag1,diag2)
# 還原arr,cols,diag1,diag2等引數
else
:continue
dfs(n,0,
,set()
,set()
,set()
)
class
solution
(object):
defsolvenqueens
(self, n)
:"""
:type n: int
:rtype: list[list[str]]
"""# 全域性變數res用於記錄最終結果
res=
# n表示矩陣的邊長,x表示當前搜尋到的行,m表示當前已生成的矩陣
# cols、diag1、diag2均用於判斷矩陣的合法性,cols表示已經佔據列,diag1、diag2用於表示已佔據的左下斜邊和右下斜邊
cols,diag1,diag2=
set(),
set(),
set(
)def
dfs(x,m,cols,diag1,diag2)
:# 搜尋到第n行時表示搜尋結束
if x==n:
else
:# 對於任意乙個x行,要搜尋n列
for y in
range
(n):
if(y not
in cols)
and(x+y not
in diag1)
and(x-y not
in diag2)
: cols.add(y)
diag1.add(x+y)
diag2.add(x-y)
m=m+[''
.join(
['q'
if i==y else
'.'for i in
range
(n)])]
dfs(x+
1,m,cols,diag1,diag2)
# 如果x+1層的搜尋都不合法,引數需要進行還原,以便在對y進行迴圈時保持判別引數的有效性
cols.remove(y)
diag1.remove(x+y)
diag2.remove(x-y)
m=m[:-
1]# 如果(x,y)不合法,則continue,搜尋下一列
else
:continue
dfs(0,
,set()
,set()
,set()
)return res
回溯 皇后 演算法筆記 回溯演算法 N皇后問題
n 皇后問題研究的是如何將 n 個皇后放置在 n n 的棋盤上,並且使皇后彼此之間不能相互攻擊。上圖為 8 皇后問題的一種解法。給定乙個整數 n,返回所有不同的 n 皇后問題的解決方案。每一種解法包含乙個明確的 n 皇后問題的棋子放置方案,該方案中 q 和 分別代表了皇后和空位。示例 輸入 4 輸出...
回溯演算法n皇后問題
這是一道考查應聘者綜合能力的問題,其中包含了演算法的設計 ui的設計 介面的設計等問題,當然在具體面試中沒有時間讓應聘者完成整個設計和編碼,但是面試官往往通過了解應聘者的設計思路和工作步驟來考查應聘者的能力。本節將具體分析這道程式設計題。所涉及到的知識點 回溯演算法 net桌面應用程式的ui設計 分...
n皇后問題(回溯演算法)
問題定義 西洋棋中,皇后可以直線進攻也可以斜線進攻,問在nxn的西洋棋棋盤上擺n個皇后,問擺使得n個皇后之間無法相互進攻有多少種擺法?通過回溯法解決。def isvalid matrix,row,col n len matrix for i in range row for j in range n...