STL 中 next_permutation 的用法简介

蓝桥杯模拟赛的一道题,子集生成问题。现场竟然没有打出来,不过现在想一想以我现在的实力在那种情况其实打出来还是很难的,当然要是会用next_permutation这么恶心的东西做出来易如反掌,其实这是刘汝佳书上的一个用法,可惜我忽略了。

今有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:

17126425374635

当然,如果把它倒过来,也是符合要求的。

请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。

 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std;
 4 int main()
 5 {
 6     int a[14]={7,4,1,2,3,5,4,1,7,2,3,5,6,6};
 7     while(next_permutation(a,a+14)){
 8         int jug=1;
 9         for(int i=0;i<14;i++)
10             if(a[i]!=a[i+a[i]+1]&&a[i]!=a[i-a[i]-1])
11             jug=0;
12         if(jug){
13             for(int i=0;i<14;i++)
14                 printf("%d ",a[i]);
15             printf("
");
16         }
17     }
18 }
View Code

有的人用C++ algorithm库中的next_permutation()函数得到全排列时发现最后得到的全排列老是不够数,不知道为什么,还以为标准库函数有错呢,其实这个标准库函数是有前置条件的,即参数必须是为非降序排列的。


至于为什么,我们看下边。

next_permutation()函数对参数进行下一个排列,如果到头了返回false,否则返回true,

但是它怎么知道排列到头了呢,原来他是按照增序对参数的每一个值进行排列的,如果参数为完全降序的话,就认为到头了,会返回false。


所以我们在求排列的时候一定要先进行升序排序,这样才能正确的得到所有的排列方式。


如string s="bca";


sort(s.begin(),s.end());

cout<<s<<endl;

while(next_permutation(s))

{

   cout<<s<<endl;

}


如果想了解next_permutation的实现原理,可以参考

C++ STL next_permutation的实现原理

转载请注明出处:

原文:http://blog.csdn.net/hongchangfirst/article/details/8663899

作者:hongchangfirst

原文地址:https://www.cnblogs.com/VectorLin/p/5293346.html