全排列函式next_permutation的用法
阿新 • • 發佈:2019-02-03
1 產生n個數的全排列
輸入 3 1 0 2
輸出 0 1 2 0 2 1 1 0 2 1 2 0 2 0 1 2 1 0
#include <stdio.h> #include <algorithm> using namespace std; int main(){ int n; while(scanf("%d",&n)&&n){ int a[1000]; for(int i=0;i<n;i++){ scanf("%d",&a[i]); } sort(a,a+n);//可以自行測試一下刪除後的結果;next_permutation(a,a+n)作用於排好序的陣列/對列中 do{ for(int i=0;i<n;i++) printf("%d ",a[i]); printf("\n"); }while(next_permutation(a,a+n)); } return 0; }
函式next_permutation(引數1,引數2)的雙引數呼叫方式,預設是按照字典序產生排列的,並且是從陣列中當前的字典序開始依次增大直至到最大字典序。
2 題目就是有一個數n(0<n<10),寫出1到n的全排列
輸入 多組(m)資料,對每組數n(0<n<10),寫出1到n的全排列
輸入 2 2 3 (兩組資料 分別為2 ,3那麼就是尋找1,2 和1,2,3的全排列)
輸出
12
21
123
132
213
231
312
321
#include <iostream> #include <algorithm> using namespace std; int main() { Int i,m,n; cin>>m; while(m--) { cin>>n; int a[n]; for(i=0;i<n;i++) a[i]=i+1; do { for(i=0;i<n;i++) cout<<a[i]; cout<<endl; } while (next_permutation(a,a+n));//排列組合函式 } return 0; }
3 第一行輸入整數N(1<N<10)表示多少組測試資料,每組測試資料第一行兩個整數 n m (1<n<9,0<m<=n)
樣例輸入
3
3 1
4 2
3 3
樣例輸出
1
2
3
12
13
14
21
23
24
31
32
34
41
42
43
123
132
213
231
312
321
#include <iostream> #include <algorithm> #include <string> using namespace std; int main() { int m, n, i, b; cin >> b; while (b--) { string a, s1, s2; cin >> n >> m; for (i = 0; i<n; i++) a += i + '1'; s1 = a.substr(0, m); cout << s1 << endl; // next_permutation(a.begin(), a.end());//先給s2一個初值 do { s2 = a.substr(0, m); if (s1 != s2) { cout << s2 << endl; s1 = s2; } } while (next_permutation(a.begin(), a.end())); } return 0; }