输入一个整数n,按字典序从大到小的顺序输出前n个数的所有排序。以下列出常用的两种方法。
递归枚举法:
#include<iostream>
using namespace std;
void printf_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;
printf_permutation(n,A,cur+1);
}
}
}
int main(){
int n;
int A[1000];
cin>>n;
printf_permutation(n,A,0);
}
使用STL中的next_permutation法:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n,A[1000];
cin>>n;
for(int i=0;i<n;i++)A[i]=i+1;
do{
for(int i=0;i<n;i++)cout<<A[i];
cout<<endl;
}
while(next_permutation(A,A+n));
return 0;
}
结果:
注:
C++提供的STL中提供库函数next_permutation。他的基本原理是重新排列范围内的元素[first,last)返回按照字典序排列的下一个值较大的组合。
返回值:如果有一个更高的排列,它重新排列元素,并返回true;如果这是不可能的(因为它已经在最大可能的排列),它按升序排列重新元素,并返回false。
注意如果不是从最小的字典序开始,那么之前应该sort(a,a+n).
练习题:
HDU 1027