头歌educoder三分密码c++题

题目描述
在 TrifidCipher 中,编码是通过使用一个表格将每个明文字母分解为一个三元组,混合三元组的组成部分,然后逆向应用表格,将这些混合的三元组转换为密文字母。

创建一个带有三个参数的函数;一个 27 个字母的键、一个中断点和一个包含要编码的消息的字符串。

加密规则有一些变化。密码规则的一个版本概述如下:

key="EPSDUCVWYM+ZLKXNBTFGORIJHAQ"
period=5
message="DEFENDTHEEASTWALLOFTHECASTLE+"

trifidcipher(key,period,message)➞"SUEFECPHSEGYYJIXIMFOFOCEJLBSP"

步骤1:将键分成三个方块:

方块 1 方 2 块 3
1 2 3 1 2 3 1 2 3
1 E P S 1 M + Z 1 F G O
2 D U C 2 L K X 2 R I J
3 V W Y 3 N B T 3 H A Q
步骤2:找到上面方块中的明文字母,D在第1方块,第2行,第1列,所以D变成121。同理,E变成111,依此类推。

垂直写下每个字母对应的数字:

D E F E N D T H E E A S T W A L L O F T H E C A S T L E +
1 1 3 1 2 1 2 3 1 1 3 1 2 1 3 2 2 3 3 2 3 1 1 3 1 2 2 1 2
2 1 1 1 3 2 3 3 1 1 3 1 3 3 3 2 2 1 1 3 3 1 2 3 1 3 2 1 1
1 1 1 1 1 1 3 1 1 1 2 3 3 2 2 1 1 3 1 3 1 1 3 2 3 3 1 1 2
步骤3:目前仍是替换密码,很容易破解。现在,你必须使用周期,它通常是5−20之间的一个数字。

D E F E N D T H E E A S T W A L L O F T H E C A S T L E +
1 1 3 1 2 1 2 3 1 1 3 1 2 1 3 2 2 3 3 2 3 1 1 3 1 2 2 1 2
2 1 1 1 3 2 3 3 1 1 3 1 3 3 3 2 2 1 1 3 3 1 2 3 1 3 2 1 1
1 1 1 1 1 1 3 1 1 1 2 3 3 2 2 1 1 3 1 3 1 1 3 2 3 3 1 1 2
步骤4:将数字分组,水平读出每组中的数字,然后使用原始的键格替换回字母。

113 122 111 311 111 123 112 331 113 111 312 133 133 323 322
S U E F E C P H S E G Y Y J I
223 322 211 311 313 311 313 123 111 323 221 232 113 112
X I M F O F O C E J L B S P
步骤5:返回最终结果:
eMessage="SUEFECPHSEGYYJIXIMFOFOCEJLBSP"

输入输出格式
输入格式
第一行有一个字符串 key,表示一个 27 个字母的键;
第二行有一个整数 period, 表示中断周期;
第三行有一个字符串 message,表示要编码的字符串。
输出格式
输出一个字符串,表示编码后的字符串。

输入输出样例1
输入
EPSDUCVWYM+ZLKXNBTFGORIJHAQ
15
MUBASHIR
输出
+OHTW+XD

输入输出样例2
输入
EPSDUCVWYM+ZLKXNBTFGORIJHAQ
5
DEFENDTHEEASTWALLOFTHECASTLE+
输出
SUEFECPHSEGYYJIXIMFOFOCEJLBSP

说明提示
键、数据和输出都将包含唯一有效的大写字母和一个加号 (+) 作为第 27 个字母。
键将始终是完整的 27 个字母,没有重复,句点始终是正整数。

以下内容部分参考ChatGPT模型:


思路:
根据题目要求,需要进行如下几个步骤:

  1. 将键分成三个方块,将每个明文字母分解为三元组。
  2. 对明文进行数字化,将每个字母对应到数字上。
  3. 将数字按照周期分组。
  4. 将每组数字转换成字母。
  5. 返回编码后的字符串。

代码实现如下:


如果我的建议对您有帮助、请点击采纳、祝您生活愉快

基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦💕(最新版更智能,功能更加强大):

#include <iostream>
#include <string>

using namespace std;

// 数字转换为字母
char numToChar(int num, string key) {
    int index = num - 1;
    return key[index];
}

// 字母转换为数字
int charToNum(char character, string key) {
    for (int i = 0; i < 27; i++) {
        if (key[i] == character) return i + 1;
    }
}

string trifidcipher(string key, int period, string message) {
    // 将键分成三个方块
    char cubes[3][3][3];
    int index = 0;
    for (int cube = 0; cube < 3; cube++) {
        for (int row = 0; row < 3; row++) {
            for (int col = 0; col < 3; col++) {
                cubes[cube][row][col] = key[index];
                index++;
            }
        }
    }

    // 将字符映射到数字
    int nums[3][27];
    for (int cube = 0; cube < 3; cube++) {
        for (int row = 0; row < 3; row++) {
            for (int col = 0; col < 3; col++) {
                nums[cube][(row*3)+col] = ((cube+1)*100) + ((row+1)*10) + (col+1);
            }
        }
    }

    // 加密消息
    string result = "";
    for (int i = 0; i < message.length(); i++) {
        char currentChar = message[i];
        if (currentChar == '+') continue;
        int currentNum = charToNum(currentChar, key);
        int cube = (currentNum / 100) - 1;
        int row = ((currentNum % 100) / 10) - 1;
        int col = (currentNum % 10) - 1;
        result += to_string(nums[cube][row*3+col]);
    }

    // 将数字分组并转换回字母
    string finalResult = "";
    for (int i = 0; i < result.length(); i += period) {
        string currentGroup = result.substr(i, period);
        for (int j = 0; j < currentGroup.length(); j += 3) {
            int num = stoi(currentGroup.substr(j, 3));
            finalResult += numToChar(num, key);
        }
    }

    return finalResult;
}

int main() {
    string key;
    int period;
    string message;

    getline(cin, key);
    cin >> period;
    cin.ignore();
    getline(cin, message);

    cout << trifidcipher(key, period, message) << endl;

    return 0;
}

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
题目分析

题目描述给出了一个加密规则,需要理解题目规则并照着题目所给的步骤一步步进行编码操作。

步骤 1:将键分成三个方块,输入格式的字符串 key,需要将其转换为一个 3 * 9 的列表。

步骤 2:找到每个明文字母在方块中的位置,并用数字表示,最后将明文中的每个字母用三个数字表示。需要遍历原始字符串 message,找到每个字母在方块中的位置,并用数字表示。

步骤 3:使用中断周期 period 将数字列表切割成若干段。需要在步骤2的基础上,将数字列表根据中断周期进行分组。

步骤 4:将步骤3中的数字列表,按照行读出,再将得到的数字用键表中的字母进行替换,得到密文。

步骤 5:将得到的密文作为结果输出。

思路分析

本题主要需要用列表和字符串进行操作,具体实现方法如下:

定义三个空列表分别表示三个方块,将给定的字符串 key 中的字母按规则分到三个列表中。

遍历原始字符串 message,找到每个字母在方块中的位置,并用三个数字表示。

将数字列表根据中断周期进行分组。

按照行读出列表中的数字,并用键表进行替换,得到密文。

代码实现

以下为本题的 Python 代码实现,其中注意第 2 步中将字母转换为数字的操作,具体可以参考代码注释:
如果我的回答解决了您的问题,请采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

头歌Educoder实验:C++ 面向对象 - 类和对象的创建和使用

可以借鉴下
https://blog.csdn.net/m0_64262556/article/details/128400612