不同类型的全排列
next_permutation(a,a+n)就是把a的前n个按照全排列的顺序找到下一个排列,将a改成那个。 如果还有就返回true,否则返回false。
一个全排列的最后一个的next_permutation虽然返回false,但是a还是会被改变成一个全排列的第一个。
与之对应的还有prev_permutation。
还能够自定义比较方法,和sort一样。
- int类型
int a[]={1,3,2};
int main()
{
do{
for(int i=0;i<3;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}while(next_permutation(a,a+3));
return 0;
}
- char类型
char a[]={'1','s','r'};
int main()
{
sort(ch, ch + strlen(ch) );//排序
do{
cout<<a<<" ";
cout<<endl;
}while(next_permutation(a,a+strlen(a)));
return 0;
}
添加比较函数之后:
char a[]= {'a','A','b'};
int cmp(char a,char b) //'A'>'a'>'B'>'b'
{
if(tolower(a)!=tolower(b))
return tolower(a)>tolower(b);
else
return a>b;
}
int main()
{
sort(a,a+strlen(a),cmp);
do
{
for(int i=0; i<3; i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
while(next_permutation(a,a+strlen(a),cmp));
return 0;
}
- string类型
string line;
while(cin>>line&&line!="#")
{
sort(line.begin(),line.end());//全排列
cout<<line<<endl;
while(next_permutation(line.begin(),line.end()))
cout<<line<<endl;
}
return 0;
输入a,c,b
输出:abc的6个全排列。
例题
题目
代码
#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[10001];
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
}
while(m--){
next_permutation(a,a+n);
}
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
return 0;
}