螺旋加密(多维数组 C++)

螺旋加密
总时间限制: 1000ms 内存限制: 65536kB
描述
Chip和Dale发明了一种文本信息加密技术。他们事先秘密约定好矩阵的行数和列数。接着,将字符按如下方式编码:

  1. 所有文本只包含大写字母和空格。

  2. 每个字符均赋予一个数值:空格=0,A=1,B=2,……,Y=25,Z=26。

按照下图所示的方式,将每个字符对应数值的5位二进制数依次填入矩阵。最后用0将矩阵补充完整。例如,对于信息“ACM”,行列数均为4时,矩阵将被填充为:

螺旋加密(多维数组 C++)_第1张图片

将矩阵中的数字按行连起来形成数字串,完成加密。例子中的信息最终会被加密为:0000110100101100。

输入
一行。首先是两个整数R(1≤R≤20)和C(1≤C≤20),表示行数和列数。之后是一个只包含大写字母和空格的字符串。字符串的长度≤(R*C)/5。R和C之间以及C和字符串之间均用单个空格隔开。
输出
一行,为加密后的二进制串。注意你可能需要用0将矩阵补充完整。
样例输入

4 4 ACM

样例输出

0000110100101100

思路点拔:本题是二维数组中的一道非常经典,有难度的题目,首先,输入的是一个字符串,就看样例,A=00001,换为十进制就是1,C=00011,换成十进制就是3,M=01101,换成十进制就是13,而A的阿斯克码等于65,C的阿斯克码等于67,M的阿斯克码等于77,看到这里,大家应该知道规律了,除了空格外,其他字符都减去64,这算完成第一步了,然后我们会发现,题目要的是二进制数,所以第二步就是把转化的数化为十进制数,第三步,也是最难的一步——回形填充,观察图片,是列先逐渐变大,直到碰壁,同理,再是行逐渐变大,随后是列逐渐变小,最后是行逐渐变小,
唯一注意的就是:不要陷入死循环了!最后一步,就是将填充后的矩阵逐行输出来,本题就结束啦~,本题的核心就是将本题分解开来,然后逐个的实现,最后得到正解

#include
#include
#include
using namespace std;
int b[6],B[405],a[25][25],l,s;
char str[85];
int pd(char x) //将字符串的每个元素转化为对应的十进制数
{
    if(x==32)
        return 0;
    else
        return x-64;
}
int main()
{
    int R,C;
    scanf("%d%d%*c",&R,&C); 
    gets(str);
    int lena=strlen(str);
    for(int i=0;imemset(b,0,sizeof(b));
        int number=pd(str[i]); 
        int h=5;
        while(h>0) //将十进制数转化为二进制数
        {
            b[h--]=number%2;
            number/=2;
        }
        for(int j=1;j<=5;j++)
        {
            B[++l]=b[j]; //用辅助数组存储转化后的结果
        }
    }
    l=1;
    memset(a,-1,sizeof(a));
    int r=1,c=1;
    a[r][c]=B[l];
    while(l//转化后得到的结果回形填充进矩阵
    {
        while(c+1<=C&&a[r][c+1]==-1)  //列逐渐变大
            a[r][++c]=B[++l];
        while(r+1<=R&&a[r+1][c]==-1) //行逐渐变大
            a[++r][c]=B[++l];
        while(c-1>=1&&a[r][c-1]==-1) //列逐渐变小
            a[r][--c]=B[++l];
        while(r-1>=1&&a[r-1][c]==-1)//行逐渐变小
             a[--r][c]=B[++l];
    }
    for(int i=1;i<=R;i++) //逐行输出即可得到正解
    {
        for(int j=1;j<=C;j++)
        {
            printf("%d",a[i][j]);
        }
    }
    return 0; //华华丽丽的结束了!!
}
//代码量较大,大家可以分段调一下,再多回味回味! ^_^

你可能感兴趣的:(编程基础)