T3-加密通信

news2024/11/29 22:43:05

T3-加密通信

题目描述

在一次军事演习中,小凯担任通信兵,负责解密传来的信息。他会收到一份 nn 的数字 表(仅包含 0-9 共 10 种数码),和一份 mm 的字母表(仅包含 A-Z、a-z 共 52 种字符)。 数字表被称为解密卡,字母表被称为加密卡。规定如下名词:

  • 1.覆盖区域:将数字表和字母表对齐,使得数字表在上,字母表在下,数字与字母一一 对应,如果数字表的 1 行 1 列对应字母表的 x 行 y 列,那么数字表的 1+k 行 1+k 列对应字母 表的 x+k 行 y+k 列,此时覆盖区域为字母表以 x 行 y 列为左上角、x+n-1 行 y+n-1 列为右下角 的正方形范围。简单来说,根据图片显示,若数字表的左上角盖在了 2 行 2 列的位置,则数 字表会覆盖(2,2)到(3,3)这片区域。
  • 2.有效区域:称某字母和其在字母表的顺序数字为互相对应,字母 A 和 a 是第 1 个字母、 字母 I 和 i 是第 9 个字母,那么 A、a 和 1 对应,I、i 和 9 对应,以此类推。如果覆盖区域 的四个顶点字母恰好和原始数字表的四个顶点数字互相对应,那么这个覆盖区域称之为有效区域。
    有效区域
  • 3.数字关联:0 和任何字母关联,1 不能和任何字母关联,2-9 中的质数和大写字母关联, 2-9 中的合数和小写字母关联。若关联成功,则提取出来作为密码的一部分,如上图中 2 是 质数,需关联大写字母,2 对应的是 B,关联成功;3 是质数,需关联大写字母,3 对应的 c 关联失败;4 是合数,需关联小写字母,而 4 对应的是 D,关联失败。因此上述图中,本次 覆盖只关联成功一次,提取出一个密码 B。
    1. 解密数字表:大小为 n*n,可以由原始数字表顺时针旋转若干次 90°得到。
      翻转90度
  • 5.区域解密:有效区域和解密数字表对齐,从左到右从上到下,将和解密数字表中对应 位置数字恰好关联的字母提取出来,构成字符串。
    一次解密操作包含以下步骤:首先从左到右从上到下找出所有有效区域,依次进行解密。 对于每个有效区域首先用原始数字表进行 1 次区域解密,然后根据当前有效区域的顶点大写 字母数量 x,额外进行 x 次区域解密(如图示中四个顶点有两个大写字母,因此需旋转两次), 第 i 次解密时将原始数字表顺时针旋转 i*90°后作为解密数字表再进行区域解密。最后将所 有区域解密的字符串按序连接,构成最终的解密字符串。 你需要帮助小凯完成解密工作。

输入格式

共 n+m+1 行, 第 1 行两个正整数 n 和 m,分别代表数字表和字母表的大小; 第 2 至 n+1 行分别有连续的 n 个数码字符,代表数字表的内容; 第 n+2 至 n+m+1 行分别有连续的 m 个字母字符,代表字母表的内容。

输出格式

仅一行一个字符串,代表解密后的答案。如果答案为空串,你需要输出“No solution”

样例 #1

样例输入 #1

2 3  
11  
13  
AAB  
ACB  
BzB

样例输出 #1

CAAAC

样例 #2

样例输入 #2

3 4  
101  
245  
313  
DABa  
AFab  
Fcdc  
cdcD

样例输出 #2

BFaABabFFcAFcd

提示

  • 对于 30%的数据,保证输入的 m<=10。 在前 30%中有 10%的数据,保证数字表中仅含有 0 和 1。
  • 对于 70%的数据,保证输入的 m<=50。 在前 70%中有 30%的数据,保证字母表中仅含有小写字母。
  • 对于 100%的数据,保证输入的 n<=m<=80。

解析
解题思路如下:

  1. 首先读入数字表和字母表的大小n和m,然后读入nn的数字表和mm的字母表。

  2. 从字母表的左上角开始,枚举所有可能的n*n的覆盖区域,对于每个覆盖区域:

    a. 判断该覆盖区域是否为有效区域,即四个顶点字母是否和原始数字表的四个顶点数字互相对应。如果是有效区域,记录下该区域四个顶点中大写字母的数量x。

    b. 如果是有效区域,则首先用原始数字表进行一次区域解密,然后根据x的值,将原始数字表顺时针旋转x*90度,再进行x次区域解密。

    c. 区域解密时,将解密数字表与有效区域对齐,遍历解密数字表的每个位置,如果该位置的数字与对应的字母满足数字关联关系,则将该字母提取出来。

  3. 将所有有效区域解密得到的字符串按顺序拼接,即为最终的解密字符串。如果最终字符串为空,则输出"No solution"。

下面是C++的代码实现:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int n, m;

// 判断覆盖区域是否为有效区域
bool validArea(const vector<vector<char>>& digit, const vector<vector<char>>& map, int& upperNums, int startI, int startJ) {
    vector<pair<int, int>> corners = {{0, 0}, {0, n - 1}, {n - 1, 0}, {n - 1, n - 1}};
    for (const auto& corner : corners) {
        int i = corner.first;
        int j = corner.second;
        if (digit[i][j] == '0') {
            continue;
        }
        if (isupper(map[startI + i][startJ + j])) upperNums++;
        char c = toupper(map[startI + i][startJ + j]);
        if ((digit[i][j] - '0') != (c - 'A' + 1)) {
            return false;
        }
    }
    return true;
}

// 顺时针旋转数字表90度
vector<vector<char>> rotateMatrix90(const vector<vector<char>>& matrix) {
    int n = matrix.size();
    vector<vector<char>> rotated(n, vector<char>(n));
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < n; ++j) {
            rotated[j][n - i - 1] = matrix[i][j];
        }
    }
    return rotated;
}

// 区域解密
void decode(const vector<vector<char>>& digit, const vector<vector<char>>& map, int times, int startI, int startJ, string& ans) {
    vector<vector<char>> rotate = digit;
    while(times--) {
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                if(rotate[i][j] == '1') {
                    continue;
                } else if(rotate[i][j] == '0') {
                    ans += map[startI + i][startJ + j];
                } else if(rotate[i][j] == '2' || rotate[i][j] == '3' || rotate[i][j] == '5' || rotate[i][j] == '7') {
                    if(isupper(map[startI + i][startJ + j])) {
                        ans += map[startI + i][startJ + j];
                    }
                } else if(rotate[i][j] == '4' || rotate[i][j] == '6' || rotate[i][j] == '8' || rotate[i][j] == '9') {
                    if(islower(map[startI + i][startJ + j])){
                        ans += map[startI + i][startJ + j];
                    }
                }
            }
        }
        rotate = rotateMatrix90(rotate);
    }
}

int main() {
    cin >> n >> m;

    vector<vector<char>> digit(n, vector<char>(n));
    vector<vector<char>> map(m, vector<char>(m));

    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            cin >> digit[i][j];
        }
    }

    for(int i = 0; i < m; i++) {
        for(int j = 0; j < m; j++) {
            cin >> map[i][j];
        }
    }

    string ans;
    for(int i = 0; i < m - n + 1; i++) {
        for(int j = 0; j < m - n + 1; j++) {
            int upperNums = 0;
            if(validArea(digit, map, upperNums, i, j)) {
                decode(digit, map, upperNums + 1, i, j, ans);
            }
        }
    }

    if(ans.size() == 0){
        cout << "No solution";
        return 0;
    }
    cout << ans << endl;
    return 0;
}

该代码先判断每个覆盖区域是否为有效区域,如果是则进行解密。解密时先用原始数字表解密一次,然后根据有效区域顶点大写字母的数量确定额外需要解密的次数,每次解密前都将数字表顺时针旋转90度。最后将所有解密得到的字符串拼接输出。如果最终没有解密得到任何字符,则输出"No solution"。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1815476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣每日一题-3040

题目 给你一个整数数组 nums &#xff0c;如果 nums 至少 包含 2 个元素&#xff0c;你可以执行以下操作中的 任意 一个&#xff1a; 选择 nums 中最前面两个元素并且删除它们。选择 nums 中最后两个元素并且删除它们。选择 nums 中第一个和最后一个元素并且删除它们。 一次…

SAS:PROC SQL和ANSI标准

文章来源于SAS HELP PROC SQL 和ANSI SQL 的区别——图表和视图名称的作用域规则不同 例1&#xff1a;匹配数据集相关名称 当PROC SQL匹配数据集相关名称时&#xff0c;会依次进行3个步骤&#xff1a;1、有别名&#xff0c;用别名匹配&#xff1b;2、1匹配失败&#xff0c;在无…

Spring Cloud Bus 消息总线基础入门与实践总结

【1】基础介绍 其主要是实现分布式自动刷新配置功能&#xff0c;Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架&#xff0c;它整合了Java的事件处理机制和消息中间件的功能…

测长仪的发展历程!

测长仪的发展历程可以大致分为以下几个阶段&#xff1a; 早期发展&#xff1a; 最早的测量工具主要是一些机械式测量工具&#xff0c;如角尺、卡钳等。 16世纪&#xff0c;在火炮制造中已开始使用光滑量规。 1772年和1805年&#xff0c;英国的J.瓦特和H.莫兹利等先后制造出利用…

【网络安全的神秘世界】Kali 自带 Burp Suite 使用指南:字体与CA证书设置详解等

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 Kali 自带 Burp Suite 使用指南目录 Burp Suite的打开方式设置Burp Suite软件的字体大小查看Burp Suite 默认代理在火狐浏览器设置代理Burp Suite 抓不到本…

零售行业会员管理有哪些业务场景?解析不同业务场景的分析指标

在当今竞争激烈的零售市场中&#xff0c;会员管理不再仅仅是收集和存储数据&#xff0c;而是要求企业能够从数据中获取洞察&#xff0c;并据此制定策略。会员板块的业务场景涵盖了多个方面&#xff0c;每一个场景都为企业提供了一个独特的视角&#xff0c;帮助企业了解和服务于…

android 抓取 logcat 日志的方法

1.找到这个路径 2.然后执行命令&#xff08;adb logcat -v time >.\\logcat.log&#xff09;&#xff0c;开始抓取日志 3.这个时候就可以去操作APP了&#xff0c;复现BUG了。 Ctrlc 结束日志抓取 adb logcat -c 清空旧日志

USB端口管控软件|USB端口控制软件有哪些(小技巧)

​USB端口管控软件成为了保障企业数据安全的重要手段。 本文将为您介绍几款知名的USB端口控制软件&#xff0c;并分享一些实用的小技巧&#xff0c;帮助您更好地管理US端口&#xff0c;确保企业信息安全。#usb接口# 一、USB端口控制软件推荐 1&#xff0c;域智盾 域智盾是一…

tmux-以脚本中的tmux命令为例解释常用tmux命令

SESSIONenv_monitor_hr_parking ----- 将会话名称env_monitor_hr_parking赋值给变量SESSION tmux new-session -s $SESSION -n runner -d ----- new-session 用于创建新的会话。-s $SESSION 是一个选项&#xff0c;其中 $SESSION 是你想要给你的新会话命名的名称。-n runner 是…

如何高效接入闲鱼商品详情实时数据——goodfish.item_get API接口指南

闲鱼平台&#xff0c;作为中国领先的二手交易平台&#xff0c;拥有庞大的商品数据库和用户群体。为了提供一个透明、高效的交易环境&#xff0c;闲鱼平台通过其商品详情API接口&#xff08;goodfish.item_get&#xff09;为开发者和商家提供实时的商品信息获取服务。下面将深入…

使用 Python 和 Selenium 进行网络抓取

如果你今天的工作是从竞争对手的网站上抓取定价页面信息。你会怎么做&#xff1f;复制粘贴&#xff1f;手动输入数据&#xff1f;当然不行&#xff01;他们绝对会花费你超级多的时间&#xff0c;而且你可能会犯一些错误。 需要指出的是&#xff0c;Python已经成为最流行的数据…

超级马里奥-小游戏

学习目标&#xff1a; 练习Java面向对象的编程思想&#xff1b; 巩固Java语言基础&#xff0c;数据类型、集合、数组等&#xff1b; 深刻理解Java的三大特性&#xff0c;封装、继承、多态&#xff1b; 效果展示&#xff1a;

[发布]嵌入式系统远程测控软件-基于Qt

目录 一. 引言二. 软件功能2.1 原理2.2 软件功能2.3 运行环境 三. 软件操作使用3.1 软件界面3.2 软件功能使用详解3.2.1 连接3.2.2 数据监测&#xff08;串口示波器&#xff09;3.2.3 数据修改3.2.4 数据保存 3.3 软件的硬件连接 四. 通信协议——STM32移植篇4.1 通信协议4.2 S…

Java SE LTS版本商用收费,有那些开源的替代方案?

&#x1f680; Java SE LTS版本商用收费&#xff0c;有那些开源的替代方案&#xff1f; 摘要 Java 对于云服务、大数据、电子商务、支付、欺诈和身份、交易等许多应用程序来说都是至关重要的语言。然而&#xff0c;Oracle 对 Java SE LTS 版本的商用收费政策引发了广泛关注和…

活体检验API在Java、Python、PHP中的使用教程

活体检验API是一种基于生物特征的身份验证技术&#xff0c;通过分析和识别用户的生物信息来确认其身份。这种技术广泛应用于各种领域&#xff0c;如金融、安全、社交媒体等&#xff0c;以提高身份验证的安全性和准确性。以下是描述”活体检验API”背景的一些关键点&#xff1a;…

python dropna怎么用

pandas的设计目标之一就是使得处理缺失数据的任务更加轻松些。pandas使用NaN作为缺失数据的标记。 使用dropna使得滤除缺失数据更加得心应手。 dropna常用参数&#xff1a; # DataFrame.dropna(axis0, howany, threshNone, subsetNone, inplaceFalse) 主要的2个参数&#xff…

首个共同祖先

题目链接 首个共同祖先 题目描述 注意点 所有节点的值都是唯一的p、q 为不同节点且均存在于给定的二叉树中 解答思路 第一种思路是后序遍历找到包含p和q时的根节点&#xff08;注意可能是p或q作为根节点&#xff09;&#xff0c;对于任一节点node&#xff0c;会先查找其左…

win10及11暂停更新永久

windows更新永久暂停 winr 输入 regedit 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 新建 名称FlightSettingsMaxPauseDays 右击修改为9999代表禁用天数推迟,基数改16进制 点击高级选项调整截止日期,因为我一开始设置的6666所以是6666

ssldump一键分析网络流量(KALI工具系列二十二)

目录 1、KALI LINUX 简介 2、ssldump工具简介 3、在KALI中使用ssldump 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、操作示例 4.1 监听指定网卡 4.2 指定端口 4.3 特定主机 4.4 解码文件 4.5 显示对话摘要 4.6 显示加密数据&#xff08;需要私钥&…

分贝通到餐解决方案全新升级

消费小票总是神出鬼没;申请、报销驴唇不对马嘴;虚报陷阱难逐一排查 部门餐标视而不见;单笔超支屡见不鲜;规则复杂总被吐槽记不住 发票、单据多如牛毛;发票合规层出不穷;审核对账气血两亏; ...... 针对上述问题,分贝通全面升级了到餐解决方案。 从一线CBD商务区到地方县城,优…