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";
}
首先看一个相关的问题,还是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/C++数据对齐详细解析
- C++中引用的使用总结
- C与C++之间相互调用实例方法讲解
- C++中引用(&)的用法与应用实例分析
- 浅析STL中的常用算法
- 解析C++ 浮点数的格式化输出
- 深入分析C++中几个最不常用的关键字
- c++中inline的用法分析
- C++ Primer 第一部分基本语言
- 深入解析C++ Data Member内存布局
- 从汇编看c++中默认构造函数的使用分析
- 关于C++中的友元函数的一些总结
- C++的sstream标准库详细介绍
- 基于C++自动化编译工具的使用详解
- 浅谈C++中的string 类型占几个字节
- C/C++ 宏详细解析
- 深入分析C++中两个大数相乘结果不正确的问题
- 探讨C++中数组名与指针的用法比较分析
- 深入解析C++中的引用类型