题目
总时间限制: 1000ms 内存限制: 65536kB
描述
Chip和Dale发明了一种文本信息加密技术。他们事先秘密约定好矩阵的行数和列数。接着,将字符按如下方式编码:
- 所有文本只包含大写字母和空格。
- 每个字符均赋予一个数值:空格=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
解法
一道水题。关键在于如何螺旋式地在矩阵中迭代。
我们定义迭代器含有x, y, dir三个属性,分别表示横坐标、纵坐标和方向。方向用0,1,2,3分别表示右、下、左、上。初始化时,x=y=dir=0。
然后,我们用Next函数来让迭代器移动。我们给矩阵地位置记录一个访问位,Next调用时会先标记访问位。然后,判断迭代器按照当先方向移动的下一个位置后是否是已访问的或越界的,如果是,则需要先转到下一个方向才能继续移动。否则就移动到下一个位置。这样一来,迭代器就是螺旋式移动的了。
代码实现
#include <iostream>
#define bit(x, n) ((x >> n) & 1)
#define min(x, y) (x < y ? x : y)
inline int Ch2Int(char ch)
{
return ch == ' ' ? 0 : ch - 'A' + 1;
}
int R, C;
char str[100 + 1];