把abc全排列
方法 一:
可以看做a为前缀,bc全排列,(a与b交换)b为前缀,ac全排列,(a与c交换)c为前缀,ba全排列
在递归的时候bc全排列可看成,b为前缀,c全排列,c为前缀b全排列。
特点:明显的看出这样排列的结果不是从小到大的。
代码:
//数组存到a[0]-a[n-1],调用perm(0,n)
void perm(int b,int e){
if(b==n-1){
//输出
return ;
}
for(int i=b;i<e;i++){
swap(a[b],a[i]);
perm(b+1,e);
swap(a[b],a[i]);
}
}
方法二:
用vis数组标记,不用像方法一那样交换,而是每次都遍历所有元素,若vis[i]==0,则选中a[i]
特点:若a数组是有序的,则输出的结果也是有序的(结果从小到大)
//数组存到a[0]-a[n-1],调用perm(0)
void perm(int step){
if(step==n){
//输出b
return ;
}
for(int i=0;i<n;i++){
if(!vis[i]){
vis[i]=1;
b[step]=a[i];
perm(step+1);
vis[i]=0;
}
}
}
方法三:用next_permutation
特点:若初始数组有序,则输出的的结果也是有序
string a;
cin>>a;
do{
cout<<a<<endl;
}while(next_permutation(a.begin(),a.end()));