蓝桥杯模拟赛的一道题,子集生成问题。现场竟然没有打出来,不过现在想一想以我现在的实力在那种情况其实打出来还是很难的,当然要是会用next_permutation这么恶心的东西做出来易如反掌
,其实这是刘汝佳书上的一个用法,可惜我忽略了。
今有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:
17126425374635
当然,如果把它倒过来,也是符合要求的。
请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
有的人用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的实现原理,可以参考
转载请注明出处:
原文:http://blog.csdn.net/hongchangfirst/article/details/8663899
作者:hongchangfirst