总时间限制: 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
#include<bits/stdc++.h>
using namespace std;
int min(int x,int y)
{
if(x>y)
return y;
else
return x;
}//取最小值
int main()
{
int x,y,a[400],c[6],leng,b[21][21],j,k;
char s[80];
cin>>x>>y;
getchar();//消除空格
gets(s);
leng=strlen(s);
int i,w;
for(i=0;i<leng;i++)
{
if(s[i]==' ')
{
c[1]=0,c[2]=0,c[3]=0,c[4]=0,c[5]=0;
}
else
{
w=int(s[i])-64;
c[5]=w%2,w=w/2;
c[4]=w%2,w=w/2;
c[3]=w%2,w=w/2;
c[2]=w%2,w=w/2;
c[1]=w%2,w=w/2;
}
for(k=1;k<=5;k++)
a[i*5+k-1]=c[k];
}
for(i=leng*5;i<x*y;i++)
a[i]=0;//往a[]里赋值
for(i=0;i<21;i++)
for(j=0;j<21;j++)
b[i][j]=2;//初始化数组b[][]
int z;
z=min(x,y)/2+1;
i=0,j=0,k=0;
while(z--)
{
while(j<y)
{
b[i][j]=a[k];
if(b[i][j+1]==1||b[i][j+1]==0||j+1>=y)
break;
j++,k++;
}
while(i<x)
{
b[i][j]=a[k];
if(b[i+1][j]==0||b[i+1][j]==1||i+1>=x)
break;
i++,k++;
}
while(j>=0)
{
b[i][j]=a[k];
if(b[i][j-1]==1||b[i][j-1]==0||j-1<0)
break;
j--,k++;
}
while(i>0)
{
b[i][j]=a[k];
if(b[i-1][j]==0||b[i-1][j]==1||i-1<0)
break;
i--,k++;
}//四个while决定了螺旋
}
for(i=0;i<x;i++)
for(j=0;j<y;j++)
printf("%d",b[i][j]);//输出
return 0;
}