`
Jianquan
  • 浏览: 18938 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

UVa 146 ID Codes

    博客分类:
  • UVa
阅读更多
题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=107&page=show_problem&problem=82
题目的要求是找出字典序中的下一个排列。
从后往前查找,如果一直都是非递减的,那么就是“No Successor”。一旦发现不符合条件的字符(if(str[i]<str[i+1]),那么就把该字符与它后面的所有字符中恰好比它大的字符调换,比方说sample中的abaacb,我们找到第一个不符合非递减条件的字母:中间的那个a,然后将它与b调换,因为在那个a后面是cb,恰好比a大的是b。第三步就是把该字符后面的所有字符按字典序排序,在sample中就是把ca排序成为ac,结束。
讲得不是很清楚,其实就是一个进位的思想,找到了那个不符合条件的字符,而它后面的都是字典序逆序,它后面的字典序中的下一个排列就是要“进位”了,所以就把那个找到的字符与它后面的所有字符中恰好比它大的字符调换,就完成了“进位”,然后还要把找到的字符后面的所有字符按字典序排序。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(void const *a,void const *b)
{
	return *((char *)a)-*((char *)b);
}
int main()
{
	char str[100];
	for(;;)
	{
		int i,len,flag=0;
		scanf("%s",str);
		if(str[0]=='#') break;
		len=strlen(str);
		if(len==1)
		{
			printf("No Successor\n");
			continue;
		}
		for(i=len-2;i>=0;i--)
		{
			if(str[i]<str[i+1])
			{
				char t;
				int j=len-1;
				while(str[j]<=str[i]) j--;
				t=str[i];
				str[i]=str[j];
				str[j]=t;
				flag=1;
				qsort(str+i+1,len-i-1,1,cmp);
				break;
			}
		}
		if(flag)
			puts(str);
		else
			printf("No Successor\n");
	}
	return 0;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics