UVa OJ 146

这是我第一道大部分靠自己力量完成的oj上面的题目,虽然比较水……前面作Oj的时候每次都不会,然后先看别人的解题报告,得到思路了才写。

题目意思就是要生成一个ID码的下一个排列。用暴力求解法,C++中已经提供了下一个排列的函数next_permutation,直接调用就行了

代码:

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
	while(1){
		char P[60];
		cin>>P;
		if(P[0]=='#')break;
		int t=1;
		int can=0;
		if(next_permutation(P,P+strlen(P))){cout<<P;}
		else cout<<"No Successor";
		cout<<endl;
	}
	return 0;
}


分析一下next_permutation函数

为了求一个排列的下一个排列,首先从字符串的末尾向字符串的开头开始搜索,直到找到两个相邻的字符(假设后面的那个为x2,前面的那个为x1),使x1<x2,这样,在x1后面的所有字符都一次减小。然后,x1所在的位置就是将要替换掉的位置。

接下来,开始第二轮搜索,还是从末尾开始向前,找到第一个比x1大的元素(假设为x3)。将这个位置和x1交换。因为x3大于x1,所以交换后的排列必然大于原来的排列。但是此时这个排列并不是下一个排列。

为了找到下一个排列,我们将x1位置(注意,是x1原来的位置,假设这个位置为*p)后面的元素(不包含x1)进行反转。因为p后面的元素是降序排列的,反转以后变成了升序排列,此时,这个排列就必然是下一个排列了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值