內容
小屮發現一張紙條,上面密密麻麻地寫滿了字。
經過研究,他發現紙條其實是張地圖,一共用了 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; }
|