您的位置:首页 > 其它

枚举排列问题

2016-06-14 11:37 190 查看
输入一个整数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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: