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

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值