以前只知道用递归做全排列,现在分享一个全排列的函数。
函数法:在<algorithm>中的next_permutation;
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n,p[10];
cin>>n;
for(int i=0;i<n;i++){
p[i]=i+1;
}
sort(p,p+n);
do{
for(int i=0;i<n;i++){
cout<<p[i]<<" ";
}
cout<<endl;
}while(next_permutation(p,p+n));//可以求下一个排列的函数
return 0;
}
递归法:
#include <iostream>
using namespace std;
void print_permutation(int n,int* A,int cur){
if(cur==n){
for(int i=0;i<n;i++) cout<<A[i];
cout<<endl;
}
else for(int i=1;i<=n;i++){
int ok=1;
for(int j=0;j<cur;j++)
if(A[j]==i) ok=0;
if(ok){
A[cur]=i;
print_permutation(n,A,cur+1);
}
}
}
int main(){
int n;
int p[10];
cin>>n;
for(int i=0;i<n;i++)
p[i]=i+1;
print_permutation(n,p,0);
return 0;
}
递归方法2
#include <iostream>
using namespace std;
void f(int n,char* p,int k){
if(k==n){//递归出口
for(int i=0;i<n;i++)
cout<<p[i];
cout<<endl;
}
for(int i=k;i<n;i++){
//交换
{char t=p[i];p[i]=p[k];p[k]=t;
}
f(n,p,k+1);
//回溯
{char t=p[i];p[i]=p[k];p[k]=t;
}
}
}
int main(){
int n;
char data[10]={'a','b','c','d','e','f','g'};
cin>>n;
f(n,data,0);
return 0;
}