枚举排列问题

来源:互联网 发布:程序员 流程图 编辑:程序博客网 时间:2024/05/16 15:42

输入一个整数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

1 0
原创粉丝点击