遞迴 全排列 N皇后

2021-10-17 18:38:42 字數 1495 閱讀 5650

遞迴求出全排列,如輸出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(int x=1;x<=n;x++)

}}int main()

遞迴求出n皇后

n皇后:在nxn的方陣棋盤上擺n個皇后,要求他們中任意兩個不同行不同列,不在一條對角線上

思路1:借助上面的求全排列的思想,nxn的棋盤放n個棋子,最終每一行都會放乙個,而每個棋子的的列數就構成了乙個1~n的排列,以n=5為例,對於乙個排列,可以理解為:第一行第一列放乙個,第二行第三列放乙個,第三行第二列放乙個,第四行第四列放乙個,第五行第五列放乙個;這樣乙個排列就表徵了一種可能的放法;

接下來對於產生的全排列逐一check,若不符合要求則捨去:對於同行同列,由於我們乙個五個位置(index=1,2,3,4,5)各不相同,排的五個數(1,2,3,4,5)也不相同,所以不可能出現同行同列(比如其中有同列,但這不是乙個排列,不可能出現);對於同對角線,利用(abs(i-j) == abs(p[i]-p[j])來判斷(斜率為1或者-1的不行)

#include #include const int maxn=11;

int n,p[maxn]=;

bool hashtable[maxn]=;

int count=0;

void generatep(int index)}}

if(flag)count++;

return;

}for(int x=1;x<=n;x++)

}}int main()

思路2:和上面思路類似,不同的是利用回溯,在做排列的時候就進行判斷是否合法,以此提前返回

#include #include const int maxn=11;

int n,p[maxn]=;

bool hashtable[maxn]=;

int count=0;

void generatep(int index)

for(int x=1;x<=n;x++);

int index=0;

bool hash_table[maxk]=;

int buffer[maxk];

void get_collection(int *buffer,int i,int n,int index,int k)

for(int s=i;s}

}int main()

遞迴 全排列與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皇后問題可以理解為全排列...

遞迴初步 全排列 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個數的全排列。全排列問題,從遞迴的角度去考慮,把...

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

在考慮全排列時,要想到根據1.2.3 的順序這樣輸出這個全排列,初始index 理解index為第幾個位置 為1,且hash均為false,當index為1,for迴圈此時停在i 1這個點往下遞迴過去 第一級遞迴 同理index為2,i 2 第二級遞迴 在index為4時輸出這個p陣列,return...