题目描述
计算概论班的同学发明了一种新的文本加密算法--将文本转化为十进制数并回型存放到矩阵里。
使用者事先约定好矩阵的行数与列数,并且规定文本中仅有大写字母和空格。他们事先按照这样的方法对文本进行编码:
空格 = 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;
}