1. 程式人生 > WINDOWS開發 >AcWing 遞迴實現排列型列舉 dfs

AcWing 遞迴實現排列型列舉 dfs

技術分享圖片

技術分享圖片

預備知識:1~n這n個數的全排列共有2^n種。
  證明:第一個位置有n種情況,第二個位置有(n-1)種情況,最後一個位置有1種情況,
n * (n - 1) * ... * 1 = n!
搜尋順序:從前往後遍歷每個位置,判斷這個位置放哪個數。
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 const int N = 10;
 5 int st[N]; //0表示還沒放數,1~n表示放了哪個數 
 6 bool used[N]; //判斷每個數有沒有被用過,true表示用過,false沒用過 
 7 void dfs(int
u) { 8 if (u == n + 1) { 9 for (int i = 1; i <= n; i++) { //列印方案 10 cout << st[i] << " "; 11 } 12 cout << endl; 13 return; 14 } 15 //依次列舉每個分支,即當前位置可以放哪些數 16 for (int i = 1; i <= n; i++) { //從小到大 17 if (!used[i]) { //
找一個沒用過的數 18 st[u] = i; //放在u這個位置 19 used[i] = true; //i這個數用過了 20 dfs(u + 1); //搜尋下一層 21 st[u] = 0; //回溯回覆現場 22 used[i] = false; 23 } 24 } 25 } 26 int main() { 27 cin >> n; 28 dfs(1); //從第一位開始 29 return 0; 30 }