4 3節全排列(遞迴理解)n皇后問題

2021-10-06 02:40:33 字數 1013 閱讀 7385

在考慮全排列時,要想到根據1.2.3…的順序這樣輸出這個全排列,初始index(理解index為第幾個位置)為1,且hash均為false,當index為1,for迴圈此時停在i=1這個點往下遞迴過去(第一級遞迴),同理index為2,i=2(第二級遞迴),在index為4時輸出這個p陣列,return返回上一級遞迴(第**遞迴)的迴圈式裡,當上一級(第**遞迴)迴圈時index為3,i=3,hash[3]再次設定為了false,此時應該出迴圈返回上一級遞迴(第二級遞迴),上一級遞迴式(第二級遞迴)中index為2,i=2,結束該函式時,hash[2]又再次設定為了false,此時i++,i值更新為3,因為hash[3]是false,所以就進迴圈裡了,那麼當前的p[index]更新為3;也就是說當前位置(index為2),放的數字是3,接下來繼續遞迴,index為3,p[index]為2;得到1 3 2這個排列數,之後返回第**遞迴,迴圈過後,hash[2]=false;返回第二級遞迴,因為第二級遞迴i=3,所以只有hash[3]=false,返回第一級遞迴,此時第一級遞迴式,i=1;(只手動模擬了一級的,之後的遞迴式也是類似)

#include

#include

#include

#include

using

namespace std;

int n,p[11]

;bool hashnum[11]

=;void

generatep

(int index)

for(

int i=

1;i<=n;i++)}

}int

main()

n皇后問題是在全排列基礎上解決的,雖然看起來n皇后是2維的,但是理解起來,我們可以假設,n皇后每個都有編號(1~n)他們去坐凳子(1-n),假如每個皇后都坐在自己編號的位置,那麼那麼相當於a【i】【i】,二維陣列裡的對角線形式,所以可以看成全排列,這樣就避免皇后坐在棋盤中的同一行或列了,每個凳子(行)只可以坐乙個編號(列)的皇后,這樣我們只用考察皇后是否在同對角線就可以了

遞迴 全排列 N皇后

遞迴求出全排列,如輸出1到5的全排列 include const int maxn 11 int n,p maxn p存放已經排進來的數,n即為要求輸出1 n的全排列 bool hashtable maxn void generatep int index printf n return for i...

遞迴初步 全排列 n皇后問題

二 n皇后問題 將1 n這n個整數按照某個順序擺放的結果稱為這n個整數的乙個排列,而全排列是指這n個整數能形成的所有排列。例如對1 2 3這三個整數來說,1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 就是1 3的全排列,試求n個數的全排列。全排列問題,從遞迴的角度去考慮,把...

遞迴 全排列與n皇后

輸出全排列利用遞迴實現 每一層遞迴排列好乙個數字,抵達邊界就輸出 include using namespace std int n,p 11 hashtable 11 void generatep int index for int x 1 x n x int main n皇后問題可以理解為全排列...