next_permutation & prev_permutation & hdu 1027 Ignatius and the Princess II

两个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开始。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值