zoukankan      html  css  js  c++  java
  • 全排列函数 nyoj 366(next_permutation()函数)

    C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序、std::prev_permutation提供降序

    1.std::next_permutation函数原型

      template <class BidirectionalIterator>

      bool next_permutation (BidirectionalIterator first, BidirectionalIterator last );

     

      template <class BidirectionalIterator, class Compare>

      bool next_permutation (BidirectionalIterator first,BidirectionalIterator last, Compare comp);

     

    说明:next_permutation,重新排列范围内的元素[第一,最后一个)返回按照字典序排列下一个值较大的组合。

    返回值:如果有一个更高的排列,它重新排列元素,并返回true;如果这是不可能的(因为它已经在最大可能的排列),它按升序排列重新元素,并返回false。

    2.算法实现原理

    见:http://hi.baidu.com/bellgrade/item/70b65b8a7ea3c9c398255fd4

    算法描述:

    1、从尾部开始往前寻找两个相邻的元素

    第1个元素i,第2个元素j(从前往后数的),且i<j

    2、再从尾往前找第一个大于i的元素k。将i、k对调

    3、[j,last)范围的元素置逆(颠倒排列

    例:

    D的小L

    时间限制:4000 ms  |            内存限制:65535 KB
    难度:2
    描述
          一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡出了个题目想难倒匡匡(小L很D吧),有一个数n(0<n<10),写出1到n的全排列,这时匡匡有点囧了,,,聪明的你能帮匡匡解围吗?
    输入
    第一行输入一个数N(0<N<10),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个整数x(0<x<10)
    输出
    按特定顺序输出所有组合。 特定顺序:每一个组合中的值从小到大排列,组合之间按字典序排列。
    样例输入
    2
    2
    3
    样例输出
    12
    21
    123
    132
    213
    231
    312
    321
     1 #include <cstdio>
     2 #include <algorithm>
     3  
     4 using namespace std;
     5 int a[]={1,2,3,4,5,6,7,8,9};
     6 int main()
     7 {
     8     int t;
     9     scanf("%d", &t);
    10     while(t--){
    11         int n;
    12         scanf("%d", &n);
    13         // for(int i = 0; i < n; i++){
    14         //     a[i] = i + 1;
    15         // }    
    16         do
    17         {
    18             for(int i = 0; i < n; i++){
    19                 printf("%d", a[i]);
    20             }
    21             printf("
    ");
    22         }while (next_permutation(a, a + n));
    23     }
    24     
    25     return 0;
    26 }

    字符:

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <string>
     4  
     5 using namespace std;
     6  
     7 int main()
     8 {
     9     string str;
    10     cin >> str;
    11     sort(str.begin(), str.end());
    12     cout << str << endl;
    13     while (next_permutation(str.begin(), str.end()))
    14     {
    15         cout << str << endl;
    16     }
    17     return 0;
    18 }
  • 相关阅读:
    算法笔记--二分图判定
    算法笔记--最小表示法
    Codeforces 525A
    Codeforces 140D
    Codeforces C
    Codeforces 665C
    Codeforces 604B
    Codeforces 285C
    The Fewest Coins POJ
    Triangular Pastures POJ
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/5642351.html
Copyright © 2011-2022 走看看