在西洋棋棋盤上(8*8)放置八個皇后,使得任意兩個皇后之間不能在同一行,同一列,也不能位於同於對角線上。問共有多少種不同的方法,並且指出各種不同的放法。
使用回溯法依次假設皇后的位置,當第乙個皇后確定後,尋找下一行的皇后位置,當滿足左上、右上和正上方向無皇后,即矩陣中對應位置都為0,則可以確定皇后位置,依次判斷下一行的皇后位置。當到達第8行時,說明八個皇后安置完畢。
#八皇后問題
board =[[
0,0,
0,0,
0,0,
0,0]
,[0,
0,0,
0,0,
0,0,
0],[
0,0,
0,0,
0,0,
0,0]
,[0,
0,0,
0,0,
0,0,
0],[
0,0,
0,0,
0,0,
0,0]
,[0,
0,0,
0,0,
0,0,
0],[
0,0,
0,0,
0,0,
0,0]
,[0,
0,0,
0,0,
0,0,
0]]#total記錄多少種方法
total =
0#判斷(x,y)能否放皇后
defcan_place
(x, y)
:# 判斷(x,y)座標能否放皇后
# 1. 判斷x行是否有皇后
for i in
range(0
, y)
:if board[x]
[i]==1:
return
false
# 2. 判斷y列是否有皇后
for i in
range(0
, x)
:if board[i]
[y]==1:
return
false
# 3. 判斷"/"方向是否有皇后
for i in
range(0
, x)
:if x + y - i <=
7and board[i]
[x + y - i]==1
:return
false
# 4. 判斷"\"方向是否有皇后
for index, i in
enumerate
(range
(x -1,
-1,-
1)):
s_y = y -
(index +1)
if s_y >=0:
if board[i]
[s_y]==1
:return
false
return
true
#列印def
print_board()
:for i in
range(8
):for j in
range(8
):if board[i]
[j]==0:
print
("□ "
, end=
" ")
else
:print
("■ "
, end=
" ")
print()
#回溯法查詢適合的放法
defput_queen
(step)
:if step ==8:
print_board(
)global total
total +=
1print
("----------------"
)else
:for i in
range(8
):# 判斷該位置是否能放當前皇后
if can_place(step, i)
:# 1. 設定現場
board[step]
[i]=
1# 2. 開始遞迴
put_queen(step +1)
# 3. 恢復現場
board[step]
[i]=
0if __name__ ==
"__main__"
: put_queen(0)
print
("總共有{}種方法"
演算法 回溯法解決八皇后問題
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。八皇后問題 author dustdawn date 2019 8...
八皇后問題(回溯法)
問題描述 八皇后問題是十九世紀著名數學家高斯於1850年提出的。問題是 在8 8的棋盤上擺放8個皇后,使其不能互相攻擊,即任意的兩個皇后不能處在同意行,同一列,或同意斜線上。可以把八皇后問題拓展為n皇后問題,即在n n的棋盤上擺放n個皇后,使其任意兩個皇后都不能處於同一行 同一列或同一斜線上。問題分...
回溯法 八皇后問題
八皇后問題是高斯於1850年提出的,這是乙個典型的回溯演算法的問題。八皇后問題的大意如下 西洋棋的棋盤有8 行 8 列共64個單元格,在棋盤上擺放八個皇后,使其不能互相攻擊,也就 是說任意兩個皇后都不能處於同一行 同一列或同一斜線上。問總共有多少種擺放方法,每一種擺 放方式是怎樣的。首先來分析八皇后...