n皇后問題

2021-10-10 05:34:16 字數 1619 閱讀 4071

問題描述:在西洋棋中,皇后可以直走也可以斜著走,問在乙個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棋盤裡使不存在兩個皇后在同行同列和同一斜線上...