*提前标注:c++产生全排列的两种方法:
1)递归枚举;
2)STL next_permutation(p,p+n);
人人都愿省事,STL对于懒人来说是一个最好的选择,下面就是STL next_permutation()的适用方法。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<ctime>
using namespace std;
int p[10];
const int n=3;
int main(){
for(int i=0;i<n;i++)
cin>>p[i];
clock_t start,finish;
start=clock();
sort(p,p+n);
do{
for(int i=0;i<n;i++)
cout<<p[i];
cout<<endl;
}while(next_permutation(p,p+n));
finish=clock();
printf("time:%.7f\s\n",((float)finish-(float)start)/1000);
return 0;
}
枚举排列
1. 1-n全排列(递归)
#include<iostream>
#include<cstdio>
#include<ctime>
using namespace std;
int a[10];
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(){
clock_t start,finish;
start=clock();
print_permutation(3,a,0);
finish=clock();
printf("time:%.7f\s\n",((float)finish-(float)start)/1000);
return 0;
}
2. 给定数列的全排列(递归)
<错误方法>
#include<iostream>
#include<cstdio>
#include<ctime>
using namespace std;
int a[10];
int p[10];
void print_permutation(int n,int *p,int *a,int cur){ //此方法为错误方法
if(cur==n){
for(int i=0;i<cur;i++)
cout<<a[i];
cout<<endl;
}
else {
for(int i=0;i<n;i++){
int ok=1;
for(int j=0;j<cur;j++)
if(a[j]==p[i])ok=0;
if(ok){
a[cur]=p[i];
print_permutation(n,p,a,cur+1);
}
}
}
}
int main(){
for(int i=0;i<3;i++)
cin>>p[i];
clock_t start,finish;
start=clock();
print_permutation(3,p,a,0);
finish=clock();
printf("time:%.7f\s\n",((float)finish-(float)start)/1000);
return 0;
}
<正确方法>
#include<iostream>
#include<cstdio>
#include<ctime>
using namespace std;
int a[10];
int p[10];
void print_permutation(int n,int *p,int *a,int cur){
if(cur==n){
for(int i=0;i<cur;i++)
cout<<a[i];
cout<<endl;
}
else {
for(int i=0;i<n;i++)if(!i||p[i]!=p[i-1]){
int c1=0,c2=0;
for(int j=0;j<cur;j++)if(a[j]==p[i])c1++;
for(int j=0;j<n;j++)if(p[j]==p[i])c2++;
if(c1<c2){
a[cur]=p[i];
print_permutation(n,p,a,cur+1);
}
}
}
}
int main(){
for(int i=0;i<3;i++)
cin>>p[i];
clock_t start,finish;
start=clock();
print_permutation(3,p,a,0);
finish=clock();
printf("time:%.7f\s\n",((float)finish-(float)start)/1000);
return 0;
}