回溯法解決八皇后問題

2021-10-02 08:37:10 字數 2424 閱讀 5839

在西洋棋棋盤上(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個單元格,在棋盤上擺放八個皇后,使其不能互相攻擊,也就 是說任意兩個皇后都不能處於同一行 同一列或同一斜線上。問總共有多少種擺放方法,每一種擺 放方式是怎樣的。首先來分析八皇后...