遞迴求出全排列,如輸出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...