n皇后是排列樹,也是n叉樹,排列數要求:n後不在對角線上;n叉樹:n後不在對角線上且不在同一列上。
n後不在對角線上且不在同一列上。
通過畫圖,可以輕易得到:對角線,行差距==列差距:
def
place
(self,k)
:for i in
range
(k):
ifabs
(k-i)
==abs
(self.solution[k]
-self.solution[i]
)or self.solution[k]
==self.solution[i]
:return
false
return
true
class
nqueen
:def
__init__
(self,n)
: self.n = n
self.
sum=
0 self.solution =[-
1]*n self.solutionlist =
self.depth =
0def
place
(self,k)
:for i in
range
(k):
ifabs
(k-i)
==abs
(self.solution[k]
-self.solution[i]
)or self.solution[k]
==self.solution[i]
:return
false
return
true
defback_tracking
(self,depth)
:if depth > n-1:
self.
sum+=
1# print self.solution
self.solutionlist +=
[self.solution[:]
]else
:for i in
range
(n):
self.solution[depth]
= i if self.place(depth)
: self.back_tracking(depth+1)
self.solution[depth]=-
1def
output_nqueen
(self)
: self.back_tracking(self.depth)
return self.solutionlist,self.
sumif __name__ ==
'__main__'
:
n=4 nqueen = nqueen(n)
list
,sum
=nqueen.output_nqueen(
)print
list
print
sum[[1
,3,0
,2],
[2,0
,3,1
]]2
class
nqueen2
:def
__init__
(self,n)
: self.n = n
self.
sum=
0 self.solution =[-
1]*n self.solutionlist =
self.depth =
0def
place
(self,k)
:for i in
range
(k):
ifabs
(k-i)
==abs
(self.solution[k]
-self.solution[i]
)or self.solution[k]
==self.solution[i]
:return
false
return
true
defback_tracking_iteration
(self)
:while self.depth >=0:
self.solution[self.depth]+=1
# 找到乙個滿足條件的
while self.solution[self.depth]
< self.n and
not self.place(self.depth)
: self.solution[self.depth]+=1
# 子樹沒有遍歷完畢
if self.solution[self.depth]
<= n-1:
if self.depth == n-1:
self.
sum+=
1 self.solutionlist +=
[self.solution[:]
]# 進入下一層,初始化下一層子樹起始點
else
: self.depth +=
1 self.solution[self.depth]=-
1# 子樹遍歷完畢開始回溯 ,還是從上一層沒走完的地方繼續走
else
: self.depth -=
1def
output_nqueen
(self)
: self.back_tracking_iteration(
)return self.solutionlist,self.
sumif __name__ ==
'__main__'
:
n=4 nqueen = nqueen2(n)
list
,sum
=nqueen.output_nqueen(
)print
list
print
sum[[1
,3,0
,2],
[2,0
,3,1
]]2
回溯法 八皇后
題目大意 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n1 n1,而皇后個數也變成n2。而且...
8皇后回溯法
思路 逐行放置,逐列搜尋。從當前行的第一列開始搜尋,判斷該位置是否合法。合法則遞迴判斷下一行,不合法則搜尋下一列,直到最後一列也不符合,或者在最後一行放下棋子就返回上一次遞迴,一直到第一行遍歷完畢。include include include define maxsize 8 char a max...
回溯法(四皇后)
回溯法的基本思想 1.在包含問題的所有解的解空間樹中 解空間 不是所有正解的集合的意思,包含完成一件事的正確部分的意思 按照深度優先搜尋的策略,從根結點出發深度探索解空間樹。2.當探索到某一結點時,要判斷該結點是否包含問題的解 a 若包含,就從出發繼續探索下去 b 若該結點不包含問題的解那就說明以該...