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后面的元素是降序排列的,反转以后变成了升序排列,此时,这个排列就必然是下一个排列了。
- UVa OJ 146
- UVa OJ
- uva oj java输入输出
- UVa OJ 401-Palindromes
- UVa OJ 579-ClockHands
- UVa OJ 10082-WERTYU
- UVa OJ 673-Parentheses
- UVa OJ 10106-Product
- UVa OJ 748-Exponentiation
- UVa OJ 11417-GCD
- UVa OJ 11926-Multitasking
- uva oj 414
- uva oj 458
- uva oj 494
- uva oj 445
- uva oj 488
- uva oj 490
- uva oj 694
- 基于运动特征的视频质量评价方法(基于H.264)
- ScrollView无限滚动
- 老鼠走迷宫----------递归问题
- cookie.setPath()的用法
- read_image读取图片变量名
- UVa OJ 146
- Android中的EditText默认时不弹出软键盘的方法
- KMP算法介绍及实现——轻松搞定KMP匹配算法
- C/C++中的函数参数传递机制
- (C语言)二叉树层次遍历(数据结构十六)
- 算法系列之KMP算法
- cocos2d-x、CCMenu、CCMenuItem
- 读《浪潮之巅》
- Apache无法启动解决 the requested operation has failed