全排列問題與n皇后問題

2021-08-06 02:27:52 字數 1483 閱讀 3062

全排列問題

基本思想:

從遞迴的角度考慮,將「輸出從1~n的全排列」分為若干個子問題:「輸出以1為開頭的全排列」,「輸出以2為開頭的全排列」…… 於是不妨設定乙個陣列p,用來存放當前排列;再設定乙個雜湊陣列hashtable,其中hashtable[x]當整數x已經在陣列p中時為true。

遞迴邊界:當index達到n+1時,說明p的第1~n位都已經填好了,把陣列p輸出,表示生成了乙個排列,然後直接return即可。

基本**:n=3

#include

const int maxn = 11;

//p為當前排列,hashtable記錄整數x是否已經在p中

int n, p[maxn], hashtable[maxn] = ;

//當前處理排列的index號位

void generatep(int

index)

printf("\n");

return;

}for (int x = 1; x <= n; x++) //列舉1~n,試圖將x填入p[index]

}}int main()

n皇后問題

問題描述:在乙個n*n的西洋棋棋盤上放置n個皇后,使得這n個皇后兩兩均不在同一行、同一列、同一對角線上。

遞迴法方案:

基本思想與全排列問題類似,只不過在達到遞迴邊界的情況下加了判斷是否存在同一列的方法。

**如下:

#include

#include

const

int maxn = 11;

int n, p[maxn], hashtable[maxn] = ;

int count = 0;

int generatep(int index)}}

if (flag)

printf("\n");

count++;

}return count;

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

}}int main()

回溯法:

基本思想:上乙個方法是相當暴力的,可以發現,可能存在放置一部分皇后就出現了不合法的情況,所以就沒有必要接著往下進行遞迴了。就產生了回溯法。

**:

#include

#include

const int maxn = 11;

int n, p[maxn], hashtable[maxn] = ;

intcount = 0;

int generatep(int

index)

printf("\n");

count++;

return

count;

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

}if (flag)}}

}int main()

遞迴初步 全排列 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皇后

遞迴很久之前就學過了,主要包括兩個重要點 1.遞迴邊界 2.遞迴式 例如斐波那契數列 漢諾塔等就可以很好處理。這次要記錄的是全排列和八皇后問題。全排列就是給定幾個正數,按順序排列不重複。例如 123 132 213 231 312 321 這就是1 2 3三個數的全排列。如何利用遞迴來實現呢?記當前...

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