一.使用next_permutation进行全排列
next_permutation到底是做什么的呢?next_permutation是用于求下一个排列,默认是升序排列
使用next_permutation需要头文件#include<algorithm>
函数原型:
bool next_permutation(iterator start,iterator end);bool next_permutation(iterator start,iterator end,compare cmp);
那么next_permutation是怎么求下一个排列的呢?其实,next_permutation在求下一个排列的时候,会返回是否有比它排名更靠后的排列,我们可以根据 next_permutation 的返回值求出全排列
例如 "4 3 2 1"就没有下一个排列,它是排名最靠后的.
所以,next_permutation实际上求的是比它更靠后的字典序列。
#include<iostream>
#include<algorithm>
using namespace std;
//bool next_permutation(char *start,char *end){
// char *cur=end-1,*pre=cur-1;
// while(cur>start&&*pre>=*cur)cur--,pre--;
// if(cur<=start)return false;
// for(cur=end-1;*cur<=*pre;cur--)
// swap(cur,pre);
// reverse(pre+1,end);
// return true;
//}
int main(){
int num[4]={1,2,3,4};
do{
cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<" "<<num[3]<<endl;
}while(next_permutation(num,num+4));
return 0;
}
当然,也可以自己实现next_permutation
与sort()排序函数相似,可以添加第三个参数cmp实现对数组进行降序排序。
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a,int b){
return a>b;
}
int main(){
int num[3]={3,2,1};
do{
cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<" "<<endl;
}while(next_permutation(num,num+3,cmp));
return 0;
}
对string类型排序
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main(){
string s;
cin>>s;
do{
cout<<s<<endl;
}while(next_permutation(s.begin(),s.end()));
return 0;
}
当我输入abc时,运行结果如下:
二. 使用dfs实现全排列
#include<iostream>
#include<algorithm>
using namespace std;
int a[3]={2,1,3};
int path[3];
bool st[3];//存储这个数是否用过
void dfs(int u){
if(u==3){//递归结束
for(int i=0;i<3;i++)printf("%d",path[i]);
puts("");
return ;
}
for(int i=0;i<3;i++){
if(!st[a[i]]){
path[u]=a[i];
st[a[i]]=true;
dfs(u+1);
st[a[i]]=false;//回到之前状态
}
}
}
int main(){
dfs(0);
return 0;
}
运行结果: