螺旋加密-题解

描述

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将矩阵补充完整。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <bits/stdc++.h>
using namespace std;

string tmp[26] = {"00001", "00010", "00011", "00100", "00101", "00110", "00111", "01000", "01001", "01010",
"01011", "01100", "01101", "01110", "01111", "10000", "10001", "10010", "10011", "10100",
"10101", "10110", "10111", "11000", "11001", "11010"};

int main() {
string s1, s2;
int n, m;
cin >> n >> m;
char ans[n][m];
getline(cin, s1);
for (int i = 1; i < s1.length(); i++) {
if (s1[i] == ' ')
s2 += "00000";
else
s2 += tmp[s1[i] - 'A'];
}
for (int i = n * m - s2.length(); i > 0; i--)
s2 += "0";
int t = 0, a = -1, b = m - 1, c = 0, d = n - 1;
while (a <= b && c <= d) {
if (c <= d) {
for (int j = ++a; j <= b; j++)
ans[c][j] = s2[t++];
}
if (a <= b) {
for (int i = ++c; i <= d; i++)
ans[i][b] = s2[t++];
}
if (c <= d) {
for (int j = --b; j >= a; j--)
ans[d][j] = s2[t++];
}
if (a <= b) {
for (int i = --d; i >= c; i--)
ans[i][a] = s2[t++];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << ans[i][j];
}
}
return 0;
}

螺旋加密-题解
https://chenxi-tijie.pages.dev/2025/07/螺旋加密-题解/
作者
chenxi
发布于
2025年7月4日
许可协议