来源:C++ Primer Plus
next_permutation() 和 prev_permutation() 函数基本类似
两个函数的头文件均为 algorithm
next_permutation()函数:
- 用法:next_permutation(first,last)
- 作用:next_permutation()函数将 [ first , last ] 区间中的序列转换为字典序的下一个排列。如果下一个排列存在返回true,如果下一个排列不存在(即区间中包含的是字典序的最后一个排列),则该函数返回false,并将区间转换为字典序的第一个排列。
/* * Note: * next_permutation函数 C++ STL * 解决枚举排列问题 */ #include<algorithm> #include<cstdio> using namespace std; int main(){ int n,p[10]; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&p[i]); sort(p,p+n); do{ for(int i=0;i<n;i++) printf("%d ",p[i]); // 输出排列P printf("\n"); }while(next_permutation(p,p+n)); // 求下一个排列 /*如果下一个排列不存在,返回false同时将区间转换为字典序的第一个排列 printf("********\n"); for(int i=0;i<n;i++) printf("%d ",p[i]); printf("\n"); */ return 0; }
- 为什么用do while 而不用 while?因为sort之后p是最小字典序,如果用while会少一个最小字典序的全排列
prev_permutation()函数:
- 用法:prev_permutation(first,last)
- 作用:prev_permutation()函数将 [ first , last ] 区间中的序列转换为字典序的上一个排列。如果上一个排列存在返回true,如果上一个排列不存在(即区间中包含的是字典序的第一个排列),则该函数返回false,并将区间转换为字典序的最后一个排列。
/* * Note: * prev_permutation函数 C++ STL * 解决枚举排列问题 */ #include<algorithm> #include<cstdio> using namespace std; bool cmp(int a,int b){ return a>b; } int main(){ int n,p[10]; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&p[i]); sort(p,p+n,cmp); do{ for(int i=0;i<n;i++) printf("%d ",p[i]); // 输出排列P printf("\n"); }while(prev_permutation(p,p+n)); // 求上一个排列 /*如果下一个排列不存在,返回false同时将区间转换为字典序最大的一个排列 printf("********\n"); for(int i=0;i<n;i++) printf("%d ",p[i]); printf("\n"); */ return 0; }