zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    golang ---cron
    Maven私库安装与配置
    Java8新特性之重复注解(repeating annotations)浅析
    String split
    如何将xml转为python中的字典
    json字符串和dict互转
    为什么空格拷贝到linux 会变成两个
    python之socket编程
    ntpdate设置
    Nginx配置ssl证书
  • 原文地址:https://www.cnblogs.com/VectorLin/p/5293346.html
Copyright © 2011-2022 走看看