古老的密码(Ancient Cipher, NEERC 2004, UVa 1339) 算法竞赛入门 快排qsort

    ① Cipher:n密码,暗号,不重要的人(知识点啊!朋友们!)

    ② 映射:我觉得这里的映射,不单纯,很做作!白莲花!我的理解是,这里的映射是一个圈,A->B->C .... ->Z->A,所以无论你输入的是什么字母,它都可以任意映射到其他字母,这样一想的话,这个题目就简单多了。(然而并没有!(。・ˇдˇ・。)

    ③所以:判断条件就是:要记录下每个字母出现的次数,重新排序(升序,降序随便选,这里是用快排来做的排序),两个数组一样,这什么奇怪的古老密码就被破了。

    ④关于上面 那个映射的理解吧,其实有个小猫饼,看完我的代码我再说猫饼在哪儿

        (怎样,我就是心机(๑´ㅂ`๑) )

    ⑤算法竞赛入门书的作者说,在真的比赛里是不用qsort的,我写这个的目的就是

        闲得慌(想不到吧!Σ(゚д゚lll))

#include <stdio.h>
#include <stdlib.h> 
#include <string.h> 
//升序 
int cmp(const void *a, const void *b){
	return (*(int *)a - *(int *)b);
} 
int main()
{
	int i;
	int len1, len2;
	char str1[105], str2[105];
	int a[26], b[26];
	while(gets(str1)!= NULL)
	{
		gets(str2);
		len1 = strlen(str1);
		len2 = strlen(str2);
		if(len1 != len2)
		{
			printf("NO!\n");
		 } 
		 else
		 {
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		for(i = 0; i < len1; i++)
		{
			a[int(*(str1 + i) - 'A')]++;
			b[int(*(str2 + i) - 'A')]++;
			
		}
		//快排
		qsort(a,26,sizeof(int),cmp);
		qsort(b,26,sizeof(int),cmp);
		for(i = 0; i < 26; i++)
		{
			if(a[i] != b[i])
				break;        //当然这里可以用flag来做 
		}
		if(i == 26)
			printf("Yes!\n");
		else
			printf("NO!\n");
		 }
	}
	return 0;
} 
    猫饼就是:那古罗马帝国的人,怎么破解它们的密码?既然每个密码是可以转换成任意字母的?所以我理解的这个映射是有点猫饼的!希望知道的正确思路的朋友能告知我一下(谢谢大佬!(o°ω°o))

    

猜你喜欢

转载自blog.csdn.net/JustinAndy/article/details/80319565