[ 螺旋矩阵]回型加密-十进制版

Anovelencryptionalgorithmbyaclassfortransformingtextintodecimalnumbersandarrangingtheminacircularmatrix.UsesASCIIvaluesandboundaryrulesforencoding.Inputincludesastringofuppercaselettersandspaceswithspecifiedmatrixdimensions,outputistheencrypteddecimalsequence.
摘要由CSDN通过智能技术生成
题目描述

计算概论班的同学发明了一种新的文本加密算法--将文本转化为十进制数并回型存放到矩阵里。
使用者事先约定好矩阵的行数与列数,并且规定文本中仅有大写字母和空格。他们事先按照这样的方法对文本进行编码:
空格 = 00
A = 01
B = 02
C = 03
......
Y = 25
Z = 26
然后,然后按照回型遍历的方法,将每个字符对应编码的2位十进制数依次填入矩阵中,多出来的位置使用0补充。例如,对于信息“PKU”,在矩阵行列数均是3的情况下,填充结果为:
1 -> 6 -> 1
                |
0 -> 0      1
|              |
0 <- 1 <- 2
再逐行将矩阵中的数字连起来,完成加密过程。也就是上述例子中的信息最终会被加密为:
161001012

关于输入

第一行为两个整数R和C,中间用一个空格隔开,分别表示行数和列数,其中1≤R≤10,1≤C≤10。
第二行为一个只包含大写字母和空格的字符串,不会以空格开头。1≤字符串长度≤(R * C) / 2。

关于输出

一行,为加密后的十进制串

例子输入
3 3
PKU
例子输出
161001012
提示信息

注意:前导0也要输出

解题分析

首先,我们要读清题意,比如空格代表00,A-Z代表01-09。然后,我们先对读入的字符串进行操作,并把这些结果存储在一个int类型的数组当中。接着,我们采用top,bottom,left,right边界法来进行回型矩阵的读入和填充,最后输出矩阵即可。

代码实现
 #include <bits/stdc++.h>
 using namespace std;
 int main(){
    int R,C; cin>>R>>C;
    cin.ignore();
    string s; getline(cin,s);
    vector<int> num(R*C,0);
    for(int i=0,j=0;i<s.size();i++){
        if(s[i]==' '){
            j+=2;
        }
        else if(s[i]>='A' && s[i]<='I'){
            j++;
            num[j++]=s[i]-'A'+1;
        }
        else if(s[i]>='J' && s[i]<='Z'){
            int temp=s[i]-'A'+1;
            num[j++]=temp/10;
            num[j++]=temp%10;
        }
    }
    vector<vector<int>> m(R,vector<int>(C,0));
    int bottom=R-1,left=0,right=C-1,top=0;
    int i=0,j=0,k=0;
    int count=R*C;
    while(count--){
        while(j<=right && i<=bottom && i>=top && j>=left){
            m[i][j++]=num[k++];
        }
        j=right; i++; top++;
        while(j<=right && i<=bottom && i>=top && j>=left){
            m[i++][j]=num[k++];
        }
        i=bottom; j--; right--;
        while(j<=right && i<=bottom && i>=top && j>=left){
            m[i][j--]=num[k++];
        }
        j=left; i--; bottom--;
        while(j<=right && i<=bottom && i>=top && j>=left){
            m[i--][j]=num[k++];
        } 
        i=top; j++; left++;
    }
    for(int i=0;i<R;i++)
        for(int j=0;j<C;j++){
            cout<<m[i][j];
        }
    return 0;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值