25:螺旋加密

来源:互联网 发布:计算机 知乎 编辑:程序博客网 时间:2024/05/23 09:57

原题链接

总时间限制: 
1000ms 
内存限制: 
65536kB
描述

Chip和Dale发明了一种文本信息加密技术。他们事先秘密约定好矩阵的行数和列数。接着,将字符按如下方式编码:

1. 所有文本只包含大写字母和空格。

2. 每个字符均赋予一个数值:空格=0,A=1,B=2,……,Y=25,Z=26。

按照下图所示的方式,将每个字符对应数值的5位二进制数依次填入矩阵。最后用0将矩阵补充完整。例如,对于信息“ACM”,行列数均为4时,矩阵将被填充为:


将矩阵中的数字按行连起来形成数字串,完成加密。例子中的信息最终会被加密为:0000110100101100。

输入
一行。首先是两个整数R(1≤R≤20)和C(1≤C≤20),表示行数和列数。之后是一个只包含大写字母和空格的字符串。字符串的长度≤(R*C)/5。R和C之间以及C和字符串之间均用单个空格隔开。
输出
一行,为加密后的二进制串。注意你可能需要用0将矩阵补充完整。
样例输入
4 4 ACM
样例输出
0000110100101100

源码

#include <iostream>#include <cstring>using namespace std;string table[27]={"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"};int get(string str, int index){    if (index >= str.size()*5) return 0; // 余位补0    string code;    int i = index / 5;    if (str[i] == ' ') return 0;    code = table[str[i]-'A'+1];    int j = index % 5;    return (int)(code[j]-'0');}int main(){    // 右下左上四个方向的变化    int step[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};    int row, col, A[20][20]={0}, B[20][20]={0}, i, j, k, size;    int x, y, direction=0;    cin >> row >> col;    size = row * col;    string str;    getchar(); // 消耗掉一个空格    getline(cin, str);    i = j = 0;    for (k=0; k<size; k++){        A[i][j] = get(str, k);        B[i][j] = 1; // 已经走过        x = i + step[direction][0];        y = j + step[direction][1];        if (x<0||x>=row||y<0||y>=col||B[x][y])            direction = (direction+1)%4;        i += step[direction][0];        j += step[direction][1];    }    for (i=0; i<row; i++)        for (j=0; j<col; j++)            cout << A[i][j];    cout << endl;    return 0;}