# 第一行肯定會有乙個放置皇后,以此來迴圈
# 回溯的條件,如果位置衝突(列或者斜線,因為是行位置是columnposition的索引,因為不會重複)
class
solution()
:def
slove
(self, n)
: self.num =
0 self.helper([-
1]* n,
0, n)
defhelper
(self, columnposition, rowindex, n)
:if rowindex == n:
self.printsolution(columnposition,n)
self.num+=
1return
for column in
range
(n):
columnposition[rowindex]
= column # 放置元素,位置為[rowindex][column]
if self.isvaild(columnposition, rowindex)
: self.helper(columnposition, rowindex +
1, n)
defisvaild
(self,columnposition, rowindex)
:for i in
range
(rowindex)
:if columnposition[i]
== columnposition[rowindex]
:# 判斷這一列是否有皇后
return
false
elif
abs(columnposition[i]
- columnposition[rowindex]
)== rowindex - i:
# 斜率為1表示在一條斜線上
return
false
return
true
defprintsolution
(self, columnposition, n)
:for row in
range
(n):
line =
""for column in
range
(n):
if columnposition[row]
== column:
line +=
"q"else
: line +=
". "
print
(line)
print
("\n"
)def
printnum
(self)
:print
(self.num)
if __name__ ==
'__main__'
: mysolution = solution(
) mysolution.slove(8)
mysolution.printnum(
)<<
<
。。。...
.... q
.. q...
.. q..
....
....
.. q.
.. q...
....
... q...
....
.. q...
. q...
....
.... q..
. q...
. q...
....
.. q...
....
... q.
.. q...
....
....
. q...
.. q...
92
八皇后問題(回溯演算法)
八皇后問題是古老的問題,十八世紀由乙個西洋棋手提出的,即在乙個8 8 的西洋棋盤上,放置八個皇后,使它們不能相互攻擊到。即不能處於同一行,同一列,也不能處於同一條斜線上,問有多少種擺法。八皇后問題是經典的回溯演算法問題,後人利用計算機,算出了8 8 的棋盤上能擺出92種,而後又提出了n皇后問題。本人...
八皇后問題 回溯演算法
最近學習了一下列舉演算法,有兩種思路,遞迴構造和直接列舉。直接列舉的優點就是思路和程式很簡潔,缺點就在於無法簡便的減少列舉量,必須生成所有的解並進行判斷。遞迴構造就很簡單了,在生成列舉量的同時並且可以通過判斷減少列舉量從而達到了數量上的減少。簡單的說,直接列舉就是先找尋解再判斷,遞迴構造則是先判斷再...
回溯演算法 八皇后問題
問題描述 八皇后不能相互攻擊,即,八個皇后不能同行,同列,不同在同一條對角線上,對角線又可以分為左對角線和右對角線 左對角線上滿足 i j 7都相等 i,j分別是一維和二維的座標 右對角線滿足 i j 都相等 如下 include using namespace std int e q 8 8 in...