zoukankan      html  css  js  c++  java
  • next_permutation用法

    next_permutation就是按照字典序排列得到所有的排列组合!

    例如

    我们需要输出{ 1 , 2 , 3 , 4 } 的全排列(调用STL)

     1 #include<iostream>
     2 #include<algorithm>
     3 using namespace std;
     4 int main()
     5 {
     6     int ans[4]={1,2,3,4};
     7     sort(ans,ans+4);    /* 这个sort可以不用,因为{1,2,3,4}已经排好序*/
     8     do                             /*注意这步,如果是while循环,则需要提前输出*/
     9     {
    10         for(int i=0;i<4;++i)
    11             cout<<ans[i]<<" ";
    12         cout<<endl;
    13     }while(next_permutation(ans,ans+4));
    14     return 0;
    15 }

    自己写全排列函数:

     1 int A[maxn];
     2 void Next_permutation(int n,int a[],int cur) {
     3     if (cur == n) {
     4         for (int i=0;i<n;i++) {
     5             printf("%d ",A[i]);
     6         }
     7         printf("
    ");
     8         return ;
     9     }
    10     else {
    11         for (int i=1;i<=n;i++) { // 这里就有点类似于排序了
    12             int ok = 1;
    13             for (int j=0;j<cur;j++) {
    14                 if (A[j] == i)
    15                     ok = 0;
    16             }
    17             if (ok) {
    18                 A[cur] = i;
    19                 Next_permutation(n,a,cur+1);
    20             }
    21         }
    22     }
    23 }
    24 
    25 int main() {
    26     int a[5] = {4,3,2,1,5};
    27     Next_permutation(5,a,0);
    28     return 0;
    29 }

    对于序列P生成可重复的全排列:

     1 int A[maxn],P[maxn];
     2 void Next_permutation(int n,int p[],int a[],int cur) {
     3     if (cur == n) {
     4         for (int i=0;i<n;i++) {
     5             printf("%d ",A[i]);
     6         }
     7         printf("
    ");
     8         return ;
     9     }
    10     else {
    11         for (int i=0;i<n;i++) {
    12             if (!i || p[i] != p[i - 1]) {   // 重复的我们就不需要再递归了
    13                 int c1 = 0, c2 = 0;
    14                 for (int j = 0; j < cur; j++)
    15                     if (A[j] == p[i])
    16                         c1++;
    17                 for (int j = 0; j < n; j++)
    18                     if (p[j] == p[i])
    19                         c2++;
    20                 if (c2 > c1) {
    21                     A[cur] = p[i];
    22                     Next_permutation(n, P, A, cur + 1);
    23                 }
    24             }
    25         }
    26     }
    27 }
    28 
    29 int main() {
    30     for (int i=0;i<5;i++)
    31         scanf("%d",&P[i]);
    32     Next_permutation(5,P,A,0);
    33     return 0;
    34 }

    算出序列的第n个排列(注意这里从0开始计数)

     1 #include<iostream>
     2 #include<algorithm>
     3 using namespace std;
     4 int main()
     5 {
     6     int ans[7]={1,2,3,4,5,6,7};
     7     sort(ans,ans+7);  /* 同上可以不用sort */
     8     int n=0; 
     9     do                             //注意这步,如果是while循环,则需要提前输出
    10     {
    11         if(n == 1654)
    12         {
    13              for(int i=0;i<7;++i)
    14             cout<<ans[i];
    15             cout<<endl;
    16             break;
    17         }
    18         n++;
    19      }while(next_permutation(ans,ans+7));
    20     return 0;
    21 }

    给你一个序列a和序列b,反推序列b是序列a的第几个排列


    也是和上面一样,就是每次得到a的一个排列的时候去和b进行比对,并且用一个cnt计数,如果一样就输出cnt。

     next_permutation可以求下一个排列

  • 相关阅读:
    UOJ #276. 【清华集训2016】汽水
    Luogu P4585 [FJOI2015]火星商店问题
    Luogu P5416 [CTSC2016]时空旅行
    NOIP 2011 提高组初赛错题简析
    Luogu P4068 [SDOI2016]数字配对
    UOJ Easy Round #5
    Codechef September Challenge 2019 Division 2
    Project Euler Problem 675
    AtCoder Grand Contest 037
    拿2k的前端开发都会做些什么?
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/11991938.html
Copyright © 2011-2022 走看看