UVa OJ 146

来源:互联网 发布:算法研究员 编辑:程序博客网 时间:2024/06/05 10:43

这是我第一道大部分靠自己力量完成的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后面的元素是降序排列的,反转以后变成了升序排列,此时,这个排列就必然是下一个排列了。