python解決八皇后問題

2021-10-09 16:17:28 字數 2275 閱讀 3076

要將八個皇后放在棋盤上,條件是任何乙個皇后都不能威脅其他皇后,即單個皇后的同一行、同一列以及上下左右45°角的方向上都沒有其他皇后。

解題思路:每一行、每一列都只能放乙個皇后,所以從第一行出發,對於第一行來說,它有八個位置可以選擇,需要對這八個位置進行遍歷,而對第二行來說,它的選擇就小於八個,同樣對這些位置進行遍歷,以此類推,越到後面的行,其選擇越少,所以採用遞迴的方法,單個遞迴結束的標誌有兩個,1)下一行沒有位置可選,2)成功遞迴到最後一行則表明結果之一的出現,將其儲存起來。

如下圖所示:遞迴到第五行後,無論怎麼選,第六行都沒有位置可選,表明第四行的當前選擇無解

對於每一行的皇后來說,它其實都有八個位置可選,只不過因為之前的皇后先做了選擇,導致這八個位置中的一部分不可選,所以我們可以用乙個狀態表來表示哪些位置已經被選過了:

# state = [0, 2, 4] 表示第0列,第2列,第4列已有皇后

# next_x 表示當前行的選擇,0-7

# 此處是為了選擇當前行的列

defconflict

(state, next_x)

: next_y =

len(state)

# 計算當前所處的列

for i in

range

(next_y)

:# 遍歷state中的值

# 如果當前行的列與之前皇后的列重合或者在一條對角線上,表明這個位置不可選

ifabs

(next_x - state[i])in

(0, next_y - i)

:return

false

return

true

# 計算所有可能的組合,queen_nums是皇后的數量,八皇后問題就等於8,還可以計算任意數量的皇后

# depth是深度,即當前處於第幾行,用於判斷是否結束遞迴

# state儲存的哪些行已被佔據

defqueens

(queen_nums, depth, state)

: res =

# 走到最後一行時,如果有位置可選,則結果之一出現,將其儲存起來

if depth == queen_nums -1:

for i in

range

(queen_nums)

:if conflict(state, i)

:[i]

)else

:for i in

range

(queen_nums)

:if conflict(state, i)

:# 從後往前儲存結果

for kk in queens(queen_nums, depth +

1, state +

[i])

:[i]

)return res

完整**

def

conflict

(state, next_x)

: next_y =

len(state)

for i in

range

(next_y):if

abs(next_x - state[i])in

(0, next_y - i)

:return

false

return

true

defqueens

(queen_nums, depth, state)

: res =

if depth == queen_nums -1:

for i in

range

(queen_nums)

:if conflict(state, i)

:[i]

)else

:for i in

range

(queen_nums)

:if conflict(state, i)

:for kk in queens(queen_nums, depth +

1, state +

[i])

:[i]

)return res

ww = queens(8,

0,)print

(len

(ww)

)# 輸出92

八皇后問題python python解決八皇后問題

運用python的生成器可輕鬆解決八皇后問題 使用元組表示可能的解,其中每個元素表示相應行中皇后所在位置 列 即state 0 3,則說明第一行的皇后在第4列。coding utf 8 import random 檢測衝突 def conflict state,nextx state為各皇后相應位置...

python全排列解決八皇后問題

八皇后問題是指8x8的西洋棋棋盤上,如何放置8個皇后,使得任意兩個皇后不會互相攻擊。算上對稱解的話,八皇后問題有91個解 當然,我們習慣從0開始計數 不難想到,用 0,1,2,3,4,5,6,7 八個數字組成個tuple,其中數字所在位置代表了行,數字本身代表了列,則任意乙個排列即代表一種放置方法,...

python 八皇后問題

矩陣表示棋盤 字典queenlist表示已放置成功的皇后,key值代表列,value代表行 encoding utf 8 import numpy as np 判斷該位置是否為危險位置 def issafe col,row,queenlist for tempcol in range col tem...