莫和拉里设计了一种加密邮件的方法。他们首先秘密决定列的数量,并将消息(仅限字母)写下列,用额外的随机字母填充,从而制作出一个矩形的字母阵列。例如,如果消息是"在下雪的夜晚没有像家一样的地方",并且有五个列,Mo 会写下来
t o i o y
h p k n n
e l e a i
r a h s g
e c o n h
s e m o t
n l e w x
请注意,Mo 仅包含字母,并在小写例中全部写入。在此示例中,Mo 使用字符"x"来填充消息以制作矩形,尽管他可以使用任何字母。
然后,Mo 通过在每行中书写字母,从左到右和从右到左交替向拉里发送
消息。因此,以上内容将被
加密为 toioynnkpheleaigshareconh 汤姆斯nlewx
您的工作是为拉里从加密邮件中恢复原始消息(以及任何额外的填充字母)。输入
将有多个输入集。每组的输入将包括两行。第一行将包含范围 2 中的整数。..20 表示所使用的列数。下一行是多达 200 个小写字母的字符串。最后一个输入集后面是包含单个 0 的行,指示输入的末端。
输出
每个输入集应生成一行输出,提供原始的纯文消息,没有空间。
Sample Input
5 toioynnkpheleaigshareconhtomesnlewx 3 ttyohhieneesiaabss 0
Sample Output
theresnoplacelikehomeonasnowynightx thisistheeasyoneab
思路:
二维数组的字符串加密问题。
把输入的一串字符串存到一个矩阵中,奇数行顺序读,偶数行逆序读。
注意我们读取的时候是竖着读的所以我们以j为第一个循环,i为第二个的循环;
实现代码:
#include<stdio.h>
#include<string.h>
int main()
{
int t,n;
char a[210],b[210][210],c[210];
while(scanf("%d",&n),n!=0)
{
getchar();
int i,j;
int l;
gets(a);
l=strlen(a);
int o=l/n;
int k=0;
for(i=0;i<o;i++)
{
for(j=0;j<n;j++)
{
b[i][j]=a[k++];
}
}/*把数组a存入b当中*/
/*输出*/
k=0;
for(j=0;j<n;j++)
{
for(i=0;i<o;i++)
{
if(i%2==0)/*奇数行时*/
c[k++]=b[i][j];
else
c[k++]=b[i][n-j-1];
}
}
for(i=0;i<k;i++)
printf("%c",c[i]);
printf("\n");
}
return 0;
}