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