古老的密碼(Ancient Cipher, NEERC 2004, UVa 1339) 演算法競賽入門 快排qsort
阿新 • • 發佈:2018-12-26
① Cipher:n密碼,暗號,不重要的人(知識點啊!朋友們!)
② 對映:我覺得這裡的對映,不單純,很做作!白蓮花!我的理解是,這裡的對映是一個圈,A->B->C .... ->Z->A,所以無論你輸入的是什麼字母,它都可以任意對映到其他字母,這樣一想的話,這個題目就簡單多了。(然而並沒有!(。・ˇдˇ・。)
③所以:判斷條件就是:要記錄下每個字母出現的次數,重新排序(升序,降序隨便選,這裡是用快排來做的排序),兩個陣列一樣,這什麼奇怪的古老密碼就被破了。
④關於上面 那個對映的理解吧,其實有個小貓餅,看完我的程式碼我再說貓餅在哪兒
(怎樣,我就是心機(๑´ㅂ`๑) )
⑤演算法競賽入門書的作者說,在真的比賽裡是不用qsort的,我寫這個的目的就是
閒得慌(想不到吧!Σ(゚д゚lll))
貓餅就是:那古羅馬帝國的人,怎麼破解它們的密碼?既然每個密碼是可以轉換成任意字母的?所以我理解的這個對映是有點貓餅的!希望知道的正確思路的朋友能告知我一下(謝謝大佬!(o°ω°o))#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; }