遞迴實現排列型列舉
阿新 • • 發佈:2020-10-25
題目描述
把 1~n 這 n 個整數排成一行後隨機打亂順序,輸出所有可能的次序。
輸入格式
一個整數n。
輸出格式
按照從小到大的順序輸出所有方案,每行1個。
首先,同一行相鄰兩個數用一個空格隔開。
其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面。
資料範圍
1≤n≤9
輸入樣例
3
輸出樣例
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
演算法1
C++ 程式碼
#include<iostream> using namespace std; const int N = 16; int num[N]; bool st[N]; int n; void dfs(int u) { if(u > n) { for(int i = 1; i <= n; i++) { cout << num[i] << " "; } cout << endl; return; } for(int i = 1; i <= n; i++) { if(!st[i]) { num[u] = i; st[i] = true; dfs(u+1); // 恢復現場 // num[u] = 0; st[i] = false; } } } int main() { cin >> n; dfs(1); return 0; }
演算法2
C++ 程式碼
#include<iostream> #include<vector> using namespace std; const int N = 10; int n; vector<int> path; void dfs(int u, int state) { if(u == n) { for(int x : path) cout << x << " "; puts(""); return; } for(int i = 0; i < n; i++) { // 看哪個第i位是0,表示還沒有列舉過 if(!(state >> i & 1)) { path.push_back(i+1); dfs(u+1, state | 1 << i); // 恢復現場 path.pop_back(); } } } int main() { cin >> n; dfs(0, 0); return 0; }