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

题目描述

计算概论班的同学发明了一种新的文本加密算法--将文本转化为十进制数并回型存放到矩阵里。
使用者事先约定好矩阵的行数与列数,并且规定文本中仅有大写字母和空格。他们事先按照这样的方法对文本进行编码:
空格 = 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 
 using namespace std;
 int main(){
    int R,C; cin>>R>>C;
    cin.ignore();
    string s; getline(cin,s);
    vector num(R*C,0);
    for(int i=0,j=0;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> m(R,vector(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

你可能感兴趣的:(矩阵,算法,线性代数)