1. 程式人生 > >古老的密碼(Ancient Cipher, NEERC 2004, UVa 1339) 演算法競賽入門 快排qsort

古老的密碼(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))