C++ 使用矩阵进行解密,根据给定的加密解密技术

C++ 使用矩阵进行解密,根据给定的加密解密技术

在这个问题中,我们需要通过对矩阵进行对角线遍历来解密给定的密文。我们可以通过对矩阵进行对角线遍历来解决这个问题。此外,我们需要只对矩阵的上部分进行对角线遍历,以获取解密后的字符串。

问题陈述 - 我们已经给出了一个长度为N和行数的加密字符串。我们需要按行方式将该字符串放入矩阵中。之后,我们需要从[0, 0]索引开始对矩阵进行对角线遍历,以解密字符串。

示例示例

输入

str = "TRSI_ _ _UIPN _ _ _TAOT_ _ _ OL", totalRows = 4

输出

TUTORIALSPOINT

解释 – 我们可以将字符串按行放置,如下所示。

T R S I
U I P N
T A O T
O L

为了解密字符串,我们可以按照下面的方式对其进行对角遍历。

  • T -> U -> T -> O -> R -> I -> A -> L -> S -> P -> O -> I -> N -> T

    输入

str = "WCE_ _EO_ _ _LM"; totalRows = 3

输出

'WELCOME'

说明 - 加密字符串的矩阵如下所示。

W C E
E O
L M

要解密字符串,我们可以按照下面的方式遍历它。

  • W -> E -> L -> C -> O -> M -> E

方法

在这种方法中,我们将使用两个嵌套循环来遍历字符串,就像我们用来遍历2D数组一样。我们将选择字符串中的字符,使其与我们对矩阵选择字符的方式相同。

算法

步骤1 – 使用加密字符串的大小初始化N。

步骤2 – 通过将N除以总行数来获取矩阵列的总数。

步骤3 – 定义明文字符串来存储解密后的字符串。

步骤4 – 使用循环从0到总列数进行迭代。

步骤5 – 使用嵌套循环,从第p个索引开始迭代到N。还要增加q的值,以使其等于totalColumns + 1,以便我们能够在对角线上遍历到下一行。

步骤6 – 将cipher[q]追加到明文的末尾。

步骤7 – 删除明文末尾的所有空格。

步骤8 – 返回明文值。

例子

#include <bits/stdc++.h>
using namespace std;

string getPlainText(string cipher, int totalRows){
    // Get string size
    int N = cipher.size();
    // Get total columns
    int totalColumns = ceil(N / (float)totalRows);
    // String to store plain text
    string plainText;
    // Traverse matrix to encode the string
    for (int p = 0; p < totalColumns; ++p){
        for (int q = p; q < N; q += totalColumns + 1){
            // Append character to string
            plainText += cipher[q];
        }
    }
    // Remove all spaces.
    while (plainText.back() == ' ') {
        plainText.pop_back();
    }
    return plainText;
}
int main(){
    string str = "TRSI   UIPN   TAOT   OL";
    int totalRows = 4;
    cout << "The decoded string is - " << getPlainText(str, totalRows) << endl;
    return 0;
}

输出

The decoded string is - TUTORIALSPOINT

时间复杂度 – O(N),因为我们遍历字符串。

空间复杂度 – O(N),用于存储解密的字符串。

问题的目标是程序员应该学会沿对角线遍历矩阵。在这里,我们假设一个字符串被插入到矩阵中,我们沿对角线遍历它,但程序员可以使用相同的方法来沿对角线遍历真实矩阵。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程