問題描述:在西洋棋中,皇后可以直走也可以斜著走,問在乙個n×n的棋盤上如何放置n個皇后能使它們不能相互攻擊。
解決思路:回溯法,先確定乙個皇后位置,然後在其他位置確定下乙個皇后,當遍歷完所有位置都不能放第二個皇后時,回溯到上乙個皇后,把這個皇后移動到下乙個合適的位置,繼續這個步驟,直到找到n個位置。
初看這個問題時我的第一反應應是挨個遍歷(就是以格仔為單位遍歷),一想到要時間複雜度為n^n!我就知道這樣做肯定太拉胯了。
後來按行為單位遍歷,時間複雜度為n^n(跟上面不同在於同行的肯定不行可以在寫**時直接去掉,這個用的是子集樹,還有種把同行同列的都去掉只判斷是否在同斜線上,時間複雜度為n!,是排列樹)
演算法設計:
設計函式jisuan(n,huanghou_one=[1,1],huanghou=)計算n皇后位置
其中引數n表示本次是計算幾皇后
引數huanghou_one表示當前需判斷位置(注意不是第乙個皇后位置)
引數huanghou表示當前符合條件的幾個皇后的位置
當huanghou中符合條件的皇后個數達到n個時,就有了這個問題的乙個解
用迴圈來更改列數,用遞迴更改行數
while huagnhou_one[1] <= n:
判斷皇后放在當前位置和之前已經放好的皇后衝突不
如果不衝突:
jisuan(n,[huanghou[0]+1, 1],huanghou)#即將當前位置移動到下一行第一列
huanghou_one[1] += 1
**:
import copy
defjisuan
(n, huanghou_one =[1
,1], huanghou =
):iflen
(huanghou)
== n:
print
(huanghou)
huanghou_ones = copy.copy(huanghou_one)
huanghous = copy.copy(huanghou)
while huanghou_ones[1]
<= n:
return =
1for i in huanghous:
if huanghou_ones[1]
== i[1]
orabs
(huanghou_ones[0]
- i[0]
)==abs(huanghou_ones [1]
- i[1]
):return =
0if return ==1:
jisuan(n,
[huanghou_ones[0]
+1,1
], huanghous)
huanghous.pop(-1
) huanghou_ones[1]
+=1defmain()
: jisuan(4)
if __name__ ==
'__main__'
: main(
)
這樣的遍歷用的是樹的深度優先搜尋 N皇后問題
include define maxqueens 20 define minqueens 4 enum bool typedef struct queendata queendata queendata queens maxqueens 1 int ncount init int init chec...
N皇后問題
採用遞迴回溯法 執行結果 輸入8 對於n皇后解的個數,參考 當n 16時,構造法給出解,參考poj 3239 一 當n mod 6 2 且 n mod 6 3時,有乙個解為 2,4,6,8,n,1,3,5,7,n 1 n為偶數 2,4,6,8,n 1,1,3,5,7,n n為奇數 上面序列第i個數為...
N皇后問題
問題 題目 於西洋棋的玩法,因為皇后所在的位置可以縱向 橫向 兩個斜向四個方向的 捕捉 所以8皇后問題就是要求如何布置8個皇后在8 8的棋盤上而使他們互相無法 捕捉 也就是說不存在兩個皇后同行或同列,或在同一斜線上。而n皇后問題就是如何布置n個皇后在n n棋盤裡使不存在兩個皇后在同行同列和同一斜線上...