回溯法 皇后

2021-09-02 02:19:37 字數 3332 閱讀 5204

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 若該結點不包含問題的解那就說明以該...