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可以求下一个排列

  • 相关阅读:
    函数指针和指针函数和回调函数以及函数指针数组
    C语言中的结构体,结构体数组
    linux中的shell脚本编程
    回车和换行在linux下和windows下
    内存的段式管理和页式管理,逻辑地址-虚拟地址-物理地址
    [CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口
    c语言中函数调用的本质从汇编角度分析
    运算符优先级
    Redis实战经验及使用场景
    RESTful API 设计最佳实践【转】
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/11991938.html
Copyright © 2011-2022 走看看