內容
小屮發現一張紙條,上面密密麻麻地寫滿了字。
經過研究,他發現紙條其實是張地圖,一共用了 64 種符號來編寫。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
而編碼和解碼的對應能以下圖表示。

由於手動解碼過於費時,小屮希望你能幫忙將紙條上的文字還原。
輸入
第一行有兩個正整數 N, M (1 <= N, M <= 1200 且 M 為 6 的倍數),代表地圖的長寬。
第 2 ~ N + 1 行分別有 M / 6 個字元,為紙條記載的內容。
3 12
L7
v/
Xe
輸出
輸出 N 行解碼後的內容。
001011111011
101111111111
010111011110
解題思路
先建好一個 000000 ~ 111111 的字串陣列,再用一個指標陣列按照索引映射到對應的位置上 (Ex: 65 (‘A’) 就映射到第 0 項 (“000000”))
建好表之後依照題意依序查表映射出對應答案輸出即可。
完整程式碼
AC (14ms, 84KB)
| #include <stdio.h>#include <memory.h>
 
 char list[64][7], * map[256];
 
 void setList(char list[][7], char* map[])
 {
 register char* now = list;
 char tmp[5];
 for (int i = '0'; i <= '1'; i++)
 {
 tmp[0] = i;
 for (int j = '0'; j <= '1'; j++)
 {
 tmp[1] = j;
 for (int k = '0'; k <= '1'; k++)
 {
 tmp[2] = k;
 for (int l = '0'; l <= '1'; l++)
 {
 tmp[3] = l;
 for (int m = '0'; m <= '1'; m++)
 {
 tmp[4] = m;
 memcpy(now, tmp, 5);
 now[5] = '0', now += 7;
 memcpy(now, tmp, 5);
 now[5] = '1', now += 7;
 }
 }
 }
 }
 }
 for (int i = 0; i < 26; i++)
 map['A' + i] = list[i];
 for (int i = 0; i < 26; i++)
 map['a' + i] = list[26 + i];
 for (int i = 0; i < 10; i++)
 map['0' + i] = list[52 + i];
 map['+'] = list[62];
 map['/'] = list[63];
 }
 
 int main()
 {
 int n;
 char input[210];
 setList(list, map);
 scanf(" %d %*d", &n);
 getchar();
 for (int i = 0; i < n; i++)
 {
 gets(input);
 for (int j = 0; input[j]; j++)
 fputs(map[input[j]], stdout);
 putchar('\n');
 }
 return 0;
 }
 
 |