离散数学讲过这种加密的方法,其实就是关键字排序
一. 排序方法说明
先通过keyword,例如如果是BATBOY的话, 按照的先后顺序应该是104235, 也就是比如字符串是EYDEMBLRTHANMEKTETOEEOTH的话,首先因为keyword长度为6,所以排序的时候矩阵就是6列,行数是字符串的总数除以keyword的长度,此例中就是4*6矩阵.
首先对于给出的字符串先从第2列开始排,从下网上排,然后是排第一列,一次类推,直到排整个矩阵.
结果是:
MEETME
BYTHEO
LDOAKT
REENTH
然后按照从左到右的顺序输出就是所要的结果了.
// 离散数学讲过这种加密的方法,其实就是关键字排序
// 通过keyword先确定哪一行
#include<iostream>
#include<cstring>
using namespace std;
int main() {
string keyword;
string test;
char ch[100][100];
int sequence[100];
int rows, columns;
int temp;
char tem;
while (cin >> keyword && keyword != "THEEND") {
cin >> test;
columns = keyword.size();
rows = (test.size() + columns - 1)/columns;
for (int i = 0; i < columns; ++i)
sequence[i] = i;
for (int i = 0; i < columns - 1; ++i) {
for (int j = columns - 1; j > 0; --j) {
if (keyword[j] < keyword[j - 1]) {
tem = keyword[j];
keyword[j] = keyword[j - 1];
keyword[j - 1] = tem;
temp = sequence[j];
sequence[j] = sequence[j - 1];
sequence[j - 1] = temp;
}
}
}
int k = 0;
for (int i = 0; i < columns; ++i)
for (int j = 0; j < rows; ++j)
ch[j][sequence[i]] = test[k++];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < columns; ++j) {
cout << ch[i][j];
}
}
cout << endl;
}
return 0;
}
小结
这道题其实不是很难,主要是数组的重排问题,不过也是调试了蛮久,主要是一些细节问题要考虑清楚.