STL中用next_permutation解决排列问题

来源:互联网 发布:html游戏源码 编辑:程序博客网 时间:2024/06/05 11:09

排列组合问题是数学中很常见的问题。很多时候我们需要遍历各种排列,穷尽后才能找到问题的答案,C++标准库中恰好就又两个处理整数排列问题的算法,即<algorithm>中的prev_permutation和next_permutation算法,两个算法差不多,只是遍历的顺序相反,下面以next_permutation为例说明此函数的用法。

首先看一个相关的问题,还是CSDN在线编程的问题:

设数组a包含n个元素恰好是0..n - 1的一个排列,给定b[0],b[1],b[2],b[3]问有多少个0..n-1的排列a,满足(a[a[b[0]]]*b[0]+a[a[b[1]]]*b[1]+a[a[b[2]]]*b[2]+a[a[b[3]]]*b[3])%n==k  ? 输入包含5个参数:N,K,B0,B1,B2,B3,其中 4<= N<12, 0 <= K,B0,B1,B2,B3 < N。

看过题目后,思考了一会,感觉没有什么简便的方法,唯有穷举所有N个数的排列,一个个测试后才能判断是否满足所给的等式。因为之前用过next_permutation,所以一下就相到这个算法了。使用next_pernutation,主要注意所给的初始排列一定是要有序的,这是是否能正确使用此函数的关键,一般next_permutation都是结合do...while();使用的。

下面给出我的初始版本:

#include <algorithm>
#include <vector>
#include <iostream>
#include <cassert>
using namespace std;

int main(){
   int count = 0;
   int N;
   int K;
   int b0,b1,b2,b3;
   cout<<"please input N,K,b0,b1,b2,b3 respectively:\n4<=N<12,0<K,b0,b1,b2,b3<N\n";
   cin>>N>>K>>b0>>b1>>b2>>b3;
   assert(N>=4&&N<12);
   assert(0<N &&N>K && 0<b0&&b0<N && 0<b1&&b1<N && 0<b2&&b2<N && 0<b3&&b3<N);
   vector<int> a;
   for(int i = 0;i < N; ++i)
      a.push_back(i);
   do{
      if((a[a[b0]]*b0 + a[a[b1]]*b1 + a[a[b2]]*b2 + a[a[b3]]*b3)%N==K)
         count++;
    }while(next_permutation(a.begin(),a.end()));
    cout<<"the total number is "<<count<<"\n";
}


0 0
原创粉丝点击