要將八個皇后放在棋盤上,條件是任何乙個皇后都不能威脅其他皇后,即單個皇后的同一行、同一列以及上下左右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...