【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 特殊加密算法(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

👏 感谢大家的订阅➕ 和 喜欢💗

📎在线评测链接

https://app5938.acapp.acwing.com.cn/contest/2/problem/OD1082

🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系清隆解锁~

🍓OJ题目截图

在这里插入图片描述

文章目录

    • 📎在线评测链接
    • 🍓OJ题目截图
    • 🥝 特殊加密算法
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 样例解释
      • 数据范围
      • 题解
      • 参考代码

🥝 特殊加密算法

问题描述

有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下:

  1. 明文为一段由 0-9 组成的数字串。
  2. 密码本为由数字 0-9 组成的二维数组。
  3. 需要按明文串的数字顺序在密码本里找到同样的数字串,密码本里的数字串是由相邻的单元格数字组成,上下和左右是相邻的,注意:对角线不相邻,同一个单元格的数字不能重复使用。
  4. 每一位明文对应密文即为密码本中找到的单元格所在的行和列序号(序号从 0 开始)组成的两个数字。如明文第 i i i D a t a [ i ] Data[i] Data[i] 对应密码本单元格为 B o o k [ x ] [ y ] Book[x][y] Book[x][y],则明文第 i i i 位对应的密文为 X Y XY XY X X X Y Y Y 之间用空格隔开。

如果有多条密文,返回字符序最小的密文。如果密码本无法匹配,返回 “error”。

输入格式

第一行输入 1 个正整数 N N N,代表明文的长度 ( 1 ≤ N ≤ 200 ) (1 \le N \le 200) (1N200)

第二行输入 N N N 个明文数字组成的序列 D a t a [ i ] Data[i] Data[i](整数: 0 ≤ D a t a [ i ] ≤ 9 0 \le Data[i] \le 9 0Data[i]9)。

第三行 1 个正整数 M M M,代表密文的长度。

接下来 M M M 行,每行 M M M 个数,代表密文矩阵。

输出格式

输出字典序最小密文。如果无法匹配,输出 “error”。

样例输入

输入 1

2
0 3
3
0 0 2
1 3 4
6 6 4

输入 2

2
0 5
3
0 0 2
1 3 4
6 6 4

样例输出

输出 1

0 1 1 1

输出 2

error

样例解释

样例 1 中,明文 “0 3” 可以在密码本中找到对应的路径,且字典序最小的密文为 “0 1 1 1”。

样例 2 中,明文 “0 5” 无法在密码本中找到对应的路径,因此输出 “error”。

数据范围

  • 1 ≤ N ≤ 200 1 \le N \le 200 1N200
  • 0 ≤ D a t a [ i ] ≤ 9 0 \le Data[i] \le 9 0Data[i]9
  • 1 ≤ M ≤ 200 1 \le M \le 200 1M200

题解

这道题的核心在于使用深度优先搜索(DFS)来遍历密码本,寻找符合条件的路径。需要从每一个可能的起点开始搜索,并记录路径。如果找到多条路径,选择字典序最小的那条。

参考代码

  • Python
import sysdef dfs(x, y, k, visited, result):visited[x][y] = Trueresult.append(x)result.append(y)if k == n - 1:return Truefor idx in range(4):nx = x + dx[idx]ny = y + dy[idx]if 0 <= nx < m and 0 <= ny < m and not visited[nx][ny] and matrix[nx][ny] == data[k + 1]:if dfs(nx, ny, k + 1, visited, result):return Truevisited[x][y] = Falseresult.pop()result.pop()return Falsen = int(input())
data = list(map(int, input().split()))
m = int(input())
matrix = [list(map(int, input().split())) for _ in range(m)]
dx = [-1, 0, 0, 1]
dy = [0, -1, 1, 0]for i in range(m):for j in range(m):if matrix[i][j] == data[0]:visited = [[False] * m for _ in range(m)]result = []if dfs(i, j, 0, visited, result):print(' '.join(map(str, result)))sys.exit()print("error")
  • Java
import java.util.*;public class Main {static int n, m;static int[] data;static int[][] matrix;static int[] dx = {-1, 0, 0, 1};static int[] dy = {0, -1, 1, 0};public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();data = new int[n];for (int i = 0; i < n; i++) {data[i] = sc.nextInt();}m = sc.nextInt();matrix = new int[m][m];for (int i = 0; i < m; i++) {for (int j = 0; j < m; j++) {matrix[i][j] = sc.nextInt();}}for (int i = 0; i < m; i++) {for (int j = 0; j < m; j++) {if (matrix[i][j] == data[0]) {boolean[][] visited = new boolean[m][m];List<Integer> result = new ArrayList<>();if (dfs(i, j, 0, visited, result)) {for (int k = 0; k < result.size(); k++) {System.out.print(result.get(k));if (k < result.size() - 1) {System.out.print(" ");}}return;}}}}System.out.println("error");}static boolean dfs(int x, int y, int k, boolean[][] visited, List<Integer> result) {visited[x][y] = true;result.add(x);result.add(y);if (k == n - 1) {return true;}for (int idx = 0; idx < 4; idx++) {int nx = x + dx[idx];int ny = y + dy[idx];if (nx >= 0 && nx < m && ny >= 0 && ny < m && !visited[nx][ny] && matrix[nx][ny] == data[k + 1]) {if (dfs(nx, ny, k + 1, visited, result)) {return true;}}}visited[x][y] = false;result.remove(result.size() - 1);result.remove(result.size() - 1);return false;}
}
  • Cpp
#include <bits/stdc++.h>using namespace std;int n, m;
vector<int> plaintext;
vector<vector<int>> matrix;
int dx[4] = {-1, 0, 0, 1};
int dy[4] = {0, -1, 1, 0};bool dfs(int x, int y, int k, vector<vector<int>>& visited, vector<int>& result) {visited[x][y] = 1;result.push_back(x);result.push_back(y);if (k == n - 1) {return true;}for (int idx = 0; idx < 4; idx++) {int nx = x + dx[idx];int ny = y + dy[idx];if (nx >= 0 && nx < m && ny >= 0 && ny < m && !visited[nx][ny] && matrix[nx][ny] == plaintext[k + 1]) {if (dfs(nx, ny, k + 1, visited, result)) {return true;}}}visited[x][y] = 0;result.pop_back();result.pop_back();return false;
}int main() {cin >> n;plaintext.resize(n);for (int i = 0; i < n; i++) {cin >> plaintext[i];}cin >> m;matrix.resize(m, vector<int>(m));for (int i = 0; i < m; i++) {for (int j = 0; j < m; j++) {cin >> matrix[i][j];}}for (int i = 0; i < m; i++) {for (int j = 0; j < m; j++) {if (matrix[i][j] == plaintext[0]) {vector<vector<int>> visited(m, vector<int>(m, 0));vector<int> result;if (dfs(i, j, 0, visited, result)) {for (int k = 0; k < result.size(); k++) {cout << result[k];if (k < result.size() - 1) {cout << " ";}}return 0;}}}}cout << "error" << endl;return 0;
}

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

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

相关文章

Rust 跨平台-Android 和鸿蒙 OS

1. 安装 rustup rustup 是 Rust 的安装和版本管理工具 $ curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh 该命令会安装 rusup 和最新的稳定版本的 Rust&#xff1b;包括&#xff1a; rustc Rust 编译器&#xff0c;用于将 Rust 代码编译成可执行文件或库。 ca…

技术速递|Visual Studio Code 的 .NET MAUI 扩展现已正式发布

作者&#xff1a;Maddy Montaquila 排版&#xff1a;Alan Wang 今天&#xff0c;我们非常高兴地宣布 .NET MAUI VS Code 扩展插件结束了预览阶段&#xff0c;并将包含一些期待已久的新功能 - 包括 XAML IntelliSense 和 Hot Reload&#xff01; 什么是 .NET MAUI 扩展插件&…

GuLi商城-商品服务-API-三级分类-删除-页面效果

一步步学习Vue太慢了&#xff0c;准备跳过前端的学习&#xff0c;直接使用前端完整的项目 下载依赖npm install&#xff0c;会报错&#xff0c;排查了好久 我安装的是Node14&#xff0c;所以必须要安装4.14 Vscode终端输入&#xff1a;npm install node-sass4.14 输入&#x…

【博士每天一篇文献-综述】A survey on few-shot class-incremental learning

阅读时间&#xff1a;2023-12-19 1 介绍 年份&#xff1a;2024 作者&#xff1a;田松松&#xff0c;中国科学院半导体研究所&#xff1b;李璐思&#xff0c;老道明大学助理教授&#xff1b;李伟军&#xff0c;中国科学院半导体研究所AnnLab&#xff1b; 期刊&#xff1a; Neu…

LearnOpenGL - Android OpenGL ES 3.0 使用 FBO 进行离屏渲染

系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGLLearnOpenGL 笔记 - 入门 02 创建窗口LearnOpenGL 笔记 - 入门 03 你好&#xff0c;窗口LearnOpenGL 笔记 - 入门 04 你好&#xff0c;三角形OpenGL - 如何理解 VAO 与 VBO 之间的关系LearnOpenGL - Android OpenGL ES 3.0 绘制…

《Windows API每日一练》6.4 程序测试

前面我们讨论了鼠标的一些基础知识&#xff0c;本节我们将通过一些实例来讲解鼠标消息的不同处理方式。 本节必须掌握的知识点&#xff1a; 第36练&#xff1a;鼠标击中测试1 第37练&#xff1a;鼠标击中测试2—增加键盘接口 第38练&#xff1a;鼠标击中测试3—子窗口 第39练&…

vite-ts-cesium项目集成mars3d修改相关的包和配置参考

如果vite技术栈下使用原生cesium&#xff0c;请参考下面文件的包和配置修改&#xff0c;想用原生创建的viewer结合我们mars3d的功能的话。 1. package.json文件 "dependencies": {"cesium": "^1.103.0","mars3d": "^3.7.18&quo…

深度学习 - Transformer 组成详解

整体结构 1. 嵌入层&#xff08;Embedding Layer&#xff09; 生活中的例子&#xff1a;字典查找 想象你在读一本书&#xff0c;你不认识某个单词&#xff0c;于是你查阅字典。字典为每个单词提供了一个解释&#xff0c;帮助你理解这个单词的意思。嵌入层就像这个字典&#xf…

Micrometer+ZipKin分布式链路追踪

目录 背景MicrometerMicrometer与ZipKin之间的关系专业术语分布式链路追踪原理 ZipKin安装下载 MicrometerZipKin 案例演示相关文献 背景 一个系统页面上的按钮点击到结果反馈&#xff0c;在微服务框架里&#xff0c;是由N个服务组成返回结果&#xff0c;中间可能经过a->b-…

【Electron】Electron入门实现

Electron 学习笔记 Electron 是一个开源框架&#xff0c;允许开发者使用网页技术&#xff08;HTML、CSS 和 JavaScript&#xff09;来构建跨平台的桌面应用程序。它由 GitHub 开发并维护&#xff0c;最初是为了支持开发 Atom 编辑器。Electron 结合了 Chromium&#xff08;用于…

密码学及其应用 —— 对称加密技术

1. 对称加密、流加密和块加密 1.1 对称加密 对称加密&#xff08;也称为密钥加密&#xff09;是一种加密方式&#xff0c;其中加密和解密使用相同的密钥。这种加密方法基于二进制层面的操作&#xff0c;如XOR&#xff08;异或&#xff09;、SHIFT&#xff08;位移&#xff09;…

Redis Stream Redisson Stream

目录 一、Redis Stream1.1 场景1&#xff1a;多个客户端可以同时接收到消息1.1.1 XADD - 向stream添加Entry&#xff08;发消息 &#xff09;1.1.2 XREAD - 从stream中读取Entry&#xff08;收消息&#xff09;1.1.3 XRANGE - 从stream指定区间读取Entry&#xff08;收消息&…

【DevExpress】WPF DevExpressMVVM 24.1版本开发指南

DevExpressMVVM WPF 环境安装 前言重要Bug&#xff08;必看&#xff09;环境安装控件目录Theme 主题LoginWindow 登陆窗口INavigationService 导航服务DockLayout Dock类型的画面布局TreeView 树状列表注意引用类型的时候ImageSource是PresentationCore程序集的博主找了好久&am…

Navicat 外网连接 mysql (1、通过SSH方式内网访问 2、对外开放3306端口)

1、通过SSH方式内网访问 直接常规方式使用IP、账号密码连接&#xff0c;失败 SSH方式&#xff1a; 常规 选项卡中&#xff1a;localhost录入数据库账号密码 SSH 选项卡中&#xff1a;勾选使用SSH&#xff0c;输入服务器IP、账号、密码 如果出现该错误&#xff0c;可能是服务器…

Windows下activemq开启jmx

1.activemq版本信息 activemq&#xff1a;apache-activemq-5.18.4 2.Windows下activemq开启jmx 1.进入activemq conf目录&#xff0c;备份activemq.xml文件 2.编辑activemq.xml文件&#xff0c;在broker节点增加useJmx"true" <broker xmlns"http://active…

无线通讯几种常规天线类别简介

天线对于无线模块来说至关重要&#xff0c;合适的天线可以优化通信网络&#xff0c;增加其通信的范围和可靠性。天线的选型对最后的模块通信影响很大&#xff0c;不合适的天线会导致通信质量下降。针对不同的市场应用&#xff0c;天线的材质、安置方式、性能也大不一样。下面简…

基于Vue 3.x与TypeScript的PPTIST本地部署与无公网IP远程演示文稿

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统环境本地部署开源在线演示文稿应用PPTist&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问与使用该项目。 PPTist …

基于STM32的智能水质监测系统

目录 引言环境准备智能水质监测系统基础代码实现&#xff1a;实现智能水质监测系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;水质管理与优化问题解决方案与优化收尾与总结 1. 引言 智能水质监测系统通过使用STM32嵌…

RISC-V知识总结 —— 向量(扩展)指令集

资源1:晏明 - RISC-V向量扩展指令架构及LLVM自动向量化支持 - 202112118 - 第13届开源开发工具大会&#xff08;OSDTConf2021&#xff09;_哔哩哔哩_bilibili资源2:张先轶 - 基于RISC-V向量指令集优化基础计算软件生态【第12届开源开发工具大会&#xff08;OSDT2020&#xff09…

研导智能科技——AI辅助科研产品开发

人工智能&#xff08;AI&#xff09;技术的飞速发展为科研领域带来了革命性的变化。本公司致力于开发基于人工智能的科研辅助产品&#xff0c;旨在通过智能化手段提高科研人员的工作效率和研究质量。目前&#xff0c;我们成功开发了研导学术平台&#xff08;www.zhiyanxueshu.c…