Chip和Dale设计了一种新的文本加密方法。在加密前,他们需要预先约定一个矩阵的行数和列数。然后,将字符按照以下步骤进行编码:
例如,对于信息“ACM”,当矩阵的行数和列数均为4时,矩阵将被填充为:
将矩阵中的数字按行连接起来形成一个二进制字符串,完成加密。在这个例子中,信息“ACM”最终被加密为:0000110100101100。
一行输入包含两个整数R (1 ≤ R ≤ 20) 和 C (1 ≤ C ≤ 20),表示矩阵的行数和列数。接下来是一个只包含大写字母和空格的字符串,字符串的长度不超过(R * C) / 5。R和C之间以及C和字符串之间均用单个空格隔开。
一行输出,为加密后的二进制字符串。注意,如果矩阵未填满,需要用0补齐。
4 4 ACM
0000110100101100
Greater NY 2007
#include #include int R, C, cnt = 1; char code[27][6] = { "00000", "00001", "00010", "00011", "00100", "00101", "00110", "00111", "01000", "01001", "01010", "01011", "01100", "01101", "01110", "01111", "10000", "10001", "10010", "10011", "10100", "10101", "10110", "10111", "11000", "11001", "11010" }; char str[100], ctr[410], a[25][25]; int main() { scanf("%d%d ", &R, &C); gets(str); for (int i = 0; str[i] != '\0'; i++) { if (str[i] == ' ') { strcat(ctr, code[0]); } else { strcat(ctr, code[str[i] - 'A' + 1]); } } int len = strlen(ctr), x = 0, y = 0; memset(ctr + len, '0', sizeof(ctr) - sizeof(char) * len); memset(a, '#', sizeof(a)); a[0][0] = ctr[0]; while (cnt = 0 && a[x][y - 1] == '#') a[x][--y] = ctr[cnt++]; while (x - 1 >= 0 && a[x - 1][y] == '#') a[--x][y] = ctr[cnt++]; } for (int i = 0; i