Test Message

e163: 01地圖問題 1

內容

小屮發現一張紙條,上面密密麻麻地寫滿了字。

經過研究,他發現紙條其實是張地圖,一共用了 64 種符號來編寫。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

而編碼和解碼的對應能以下圖表示。

img1

由於手動解碼過於費時,小屮希望你能幫忙將紙條上的文字還原。


輸入

第一行有兩個正整數 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;
}