您的位置:首页 > 编程语言 > C语言/C++

STL中用next_permutation解决排列问题

2014-02-26 00:12 330 查看
排列组合问题是数学中很常见的问题。很多时候我们需要遍历各种排列,穷尽后才能找到问题的答案,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";

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ STL next_permutation