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()函数就好了…
万一实验考试考了呢?