STL中用next_permutation解決排列問題

排列組合問題是數學中很常見的問題。很多時候我們需要遍歷各種排列,窮盡後才能找到問題的答案,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";
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章