两个STL库函数next_permutation & prev_permutation本来不会,但看了别人的blog后有点感觉了!他的blog中没有样例(题解),而我有,所以我写成原创应该不算过分吧!
如果想多了解两个函数可以去他的blog看看。
blog链接:http://blog.csdn.net/aipb2008/article/details/2227490
next_permutation的作用就是从当前排列开始,使用一次就递增一下,可以一直增到最大。
hdu1027题意是给出n和m,从1到n进行全排列,求出第m小的那个。
把1到n存进一个数组,用next_permutation函数可以直接算出来,所以直接贴下代码吧。
#include <iostream>
#include <string>
#include <algorithm>
#define FOR(i,n) for(int i=0;i<n;i++)//定义一个for循环
using namespace std;
int n,m;
int val[1111];//从1到n。
void Init(){
int i;
FOR(i,n)
val[i]=i+1;
}
int main(){
while(cin>>n>>m){
Init();
while(m-1) next_permutation(val,val+n),m--;//第m小,因为从1到n排列算一
//次,所以人循环m-1次。
FOR(i,n-1) cout<<val[i]<<" ";
cout<<val[n-1]<<endl;
}
return 0;
}
**************************************************************************************************************************************************************************************************
下面顺便讲一下prev_permutation。
其实它的作用很简单,就是和next_permutation相反方向递减。
直接看一个小例:
代码:
#include <iostream>
using namespace std;
int main(){
int a[] = {2,3,1};
while (prev_permutation(a,a+3))
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
return 0;
}
下面看两张图,可能会很明白:
图1:从3 2 1开始。
图2:从2 3 1开始。