permutation
全排列是啥
代碼
#include <bits/stdc++.h>
using namespace std;
void permutation(int a[], int k, int m)
{
int i, j;
if (k == m)
{
for (i = 0; i < m; i++)
cout << a[i];
cout << endl;
}
else
{
for (j = k; j < m; j++)
{
swap(a[j], a[k]);
permutation(a, k + 1, m);
swap(a[j], a[k]);
}
}
}
int main()
{
int a[1000];//如果要排字典序 改成char a[1000]就行
int n;
while(cin>>n)
{
for(int i=0;i<n;i++) cin>>a[i];
permutation(a, 0, n);
}
return 0;
}
函數單拎出來:
void permutation(int a[], int k, int m)
{
int i, j;
if (k == m)//這裏很好理解,就是當換到最後一個的時候就該輸出本次排列結果了
{
for (i = 0; i < m; i++)
cout << a[i];
cout << endl;
}
else
{
for (j = k; j < m; j++)
{
swap(a[j], a[k]);
permutation(a, k + 1, m);
swap(a[j], a[k]);
}
}
}
(憨批)過程
每層交換的順序就是:我換我自己,我換我後面的,我換我後面的後面……這樣;
比如
1234,a[0]換a[0]— a[1]換a[1] — a[2]換a[2] — a[3]換a[3] —換完了輸出1234
還原也是1234(a[3]換a[3])
a[3]換完了
a[2]還能換a[3] 變成1243
(還原爲1234)
a[2]換完了
a[1]換a[2] 變成1324
再a[2]換a[3] 1342
(還原爲1324)
a[1]換a[3] 變成1423
再a[2]換a[3] 1432
(還原爲1423)–> 1324–>1234
a[1]換完了
a[0]換a[1] 變成 2134
然後就是循環 換自己 換自己後面 換自己後面的後面……
最後a[0]換完了
底下這張圖我真是不想看 md畫圖弱者地瓜
真的我好像個弱智啊…???
怎麼畫清晰易懂的圖解???
考試的時候回來還看得懂???
有幾個要注意的
1.每次進入perm(k+1)的時候其實是沒有換的,因爲i=k;
2.perm(3)就相當於要輸出了,因爲交換等於沒換,進入perm(4),就 j==k 輸出了;
3.返回上一層時的狀態並不都是1 2 3 4 (這個應該都知道吧)(手算的時候不要記錯就行)
next_permutation()
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int a[100];
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>a[i];
}
do
{
for(int i=0;i<n;i++)
{
cout<<a[i]<<' ';
}
cout<<endl;
}while(next_permutation(a,a+n));
}
}
全排列什麼的只要用next_permutation()函數就好了…
萬一實驗考試考了呢?