25:螺旋加密(1.8编程基础之多维数组)

25:螺旋加密

总时间限制: 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

http://blog.csdn.net/c20192419mys/article/details/60139015
本题目需要转换二进制,在C++中可以用自定义函数转换,暂存于一个数组中,由于二进制只有“1”和“0”,所以可以使用“bool”数组储存(本样例中是整型数组)。之后我们可以发现填入时,有4种填入方式:1.向右;2.向下;3.向左;4.向上。我们可以定义一个整型参数“lx”,有四个值,分别代表一种填入方式,用“switch”分类讨论。题目中要求剩余部分用“0”补充完整,但不用实际操作,在数组定义时的初始化即可完成。注意填入的顺序。


#include<cstdio>
#include<cstring>
int ch[450],len,sch[23][23]; //分别为转换后的2进制串,2进制串的位数,填入后的二维数组
bool chs[23][23]; //辅助二维数组
void ten_two(char); //2进制转换的函数
void strue(int,int); //辅助二维数组的初始化函数
int main()
{
    int r,c;
    char s[100]={};
    scanf("%d%d%*c",&r,&c);
    strue(r,c);
    gets(s);
    for(int i=0;i<strlen(s);i++) //转换
        ten_two(s[i]);
    int x=0,y=0,tot=0,lx=1;
    while(tot<r*c)
    {
        switch(lx)
        {
            case 1: //向左
                if(!chs[x][y+1] || y==c-1) //转向条件
                {
                    lx=2;
                    sch[x][y]=ch[tot];
                    chs[x][y]=false;
                    x++;
                    tot++;
                }
                else
                {
                    sch[x][y]=ch[tot];
                    chs[x][y]=false;
                    y++;
                    tot++;
                }
                break;
            case 2: //向下
                if(!chs[x+1][y] || x==r-1) //转向条件
                {
                    lx=3;
                    sch[x][y]=ch[tot];
                    chs[x][y]=false;
                    y--;
                    tot++;
                }
                else
                {
                    sch[x][y]=ch[tot];
                    chs[x][y]=false;
                    x++;
                    tot++;
                }
                break;
            case 3: //向右
                if(!chs[x][y-1] || y==0) //转向条件
                {
                    lx=4;
                    sch[x][y]=ch[tot];
                    chs[x][y]=false;
                    x--;
                    tot++;
                }
                else
                {
                    sch[x][y]=ch[tot];
                    chs[x][y]=false;
                    y--;
                    tot++;
                }
                break;
            case 4: //向上
                if(!chs[x-1][y] || x==0) //转向条件
                {
                    lx=1;
                    sch[x][y]=ch[tot];
                    chs[x][y]=false;
                    y++;
                    tot++;
                }
                else
                {
                    sch[x][y]=ch[tot];
                    chs[x][y]=false;
                    x--;
                    tot++;
                }
                break;
        }
    }
    for(int i=0;i<r;i++)
        for(int j=0;j<c;j++)
            printf("%d",sch[i][j]);
    return 0;
}
void ten_two(char c)
{
    int i=0,op=c-'A'+1,x[5]={};
    while(i<5)
    {
        x[i]=op%2;
        op/=2;
        i++;
    }
    for(int js=4;js>=0;js--,len++)
        ch[len]=x[js];
}
void strue(int r,int c)
{
    for(int i=0;i<r;i++)
        for(int j=0;j<c;j++)
            chs[i][j]=true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值