全排列問題
基本思想:
從遞迴的角度考慮,將「輸出從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皇后問題可以理解為全排列...