[华为OD] C卷 dfs 特殊加密算法 100

题目:

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

规则如下

1•明文为一段数字串由0-9组成

2.密码本为数字0-9组成的二维数组

3•需要按明文串的数字顺序在密码本里找到同样的数字串,密码本里的数字串是由相邻的单元 

格数字组成,上下和左右是相邻的,注意:对角线不相邻,同一个单元格的数字不能重复使 

用。

4 •每一位明文对应密文即为密码本中找到的单元格所在的行和列序号(序号从0开始)组成的两个 

数字。如明文第位Data[i]对应密码本单元格为Book[x][y],则明文第i位对应的密文为XY, X和 

Y之间用空格隔开

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

请你设计这个加密程序

示例1:

密码本

[0 0 2]

[1 3 4]

[6 6 4]

明文:3,密文."1 1”

示例2:

示例2:

密码本:

0 0 2

1 3 4

6 6 4

明文:"0 3”密文:0 1 1 1”

输入描述

第一行输入1个正整数N,代表明文的长度(1 <= N <= 200)

第二行输入N个明文数字组成的序列Data[i](整数:0<= Data[i] <= 9)

第三行1个正整数M,代表密文的长度接下来M行,每行M个数,代表密文矩阵

输出描述

输出字典序最小密文•如果无法匹配,输出"error

示例1:

输入:

2

0 3

3

0 0 2

1 3 4

6 6 4

输出:

0 1 1 1

示例2:

输入:

2

0 5

3

0 0 2

1 3 4

6 6 4

输出:

error

题解:

要在矩阵中找到连续的坐标位置,那么这种搜索就直接使用DFS搜索算法。这个题要注意有多条密文时候返回字符序最小的密文。所有搜索的时候顺序应该是左->上->下->右(因为排列是先x坐标后y坐标),这样找到第一个符合条件的数据就是最小的密文。

如果不按这个顺序的话,那么就需要将多条密文序列进行排序,找出最小结果了(这个逻辑比较好理解)

这个题只有100分,但感觉还是有点难度的

代码

import java.util.*;public class DFS1 {private static String result = "";//  private static String sumResult = "";public static void main(String[] args) {Scanner sc = new Scanner(System.in);int num = Integer.valueOf(sc.nextLine());String nums[] =sc.nextLine().split(" ");int value[] = new int[num];for(int i =0;i<nums.length;i++){value[i] = Integer.valueOf(nums[i]);}int m = Integer.valueOf(sc.nextLine());int arr[][] = new int[m][m];for(int i=0;i<m;i++){String arrs[] = sc.nextLine().split(" ");for(int j =0;j<m;j++){arr[i][j] = Integer.valueOf(arrs[j]);}}int directions[][] = {{-1,0},{0,-1},{0,1},{1,0}};  // 搜索顺序 很重要,这样第一个结果就是最小值了boolean hasdata = false;//  Map<String,List<String>> resultMap = new HashMap<>();//  List<String> resultValues = new ArrayList<>();for(int i=0;i<m;i++){for(int j=0;j<m;j++){if(arr[i][j] == value[0]){result = i+" "+j;//    sumResult = String.valueOf(i)+String.valueOf(j);//  System.out.println("first is i"+i+"j "+j);if(dfs(directions,arr,i,j,value,1,m)){hasdata = true;//  List<String> stringList = new ArrayList<>();//   stringList.add(result);//    resultMap.put(sumResult,stringList);//    resultValues.add(sumResult);break;}}}if(hasdata){break;}}if(hasdata){
//            Collections.sort(resultValues);
//            System.out.println(resultMap.get(resultValues.get(0)).get(0));System.out.println(result);}else {System.out.println("error");}}public static boolean dfs(int[][] directions, int[][] arrs, int x, int y, int[] value, int index, int m) {int presentValue = value[index];int i = 0;while (i < 4) {if(i>=4){break;}int newX = x + directions[i][0];int newY = y + directions[i][1];
//            if (newX >= 0 && newX < m && newY >= 0 && newY < m) {
//                System.out.println("newX " + newX + " newY " + newY + " arrs[newX][newY " + arrs[newX][newY] + "presentValue " + presentValue);
//            }if (newX >= 0 && newX < m && newY >= 0 && newY < m && arrs[newX][newY] == presentValue) {result += " " + newX + " " + newY;//     sumResult = sumResult + String.valueOf(newX) + String.valueOf(newY);if (index == value.length - 1) {return true;}index++;return dfs(directions, arrs, newX, newY, value, index, m);}if (newX < 0 || newX >= m || newY < 0 || newY >= m || arrs[newX][newY] != presentValue) {i++;continue;}}return false;}}

方法2:不考虑搜索顺序,按照结果集排序,找出最小的

import java.util.*;public class DFS1 {private static String result = "";private static String sumResult = "";public static void main(String[] args) {Scanner sc = new Scanner(System.in);int num = Integer.valueOf(sc.nextLine());String nums[] =sc.nextLine().split(" ");int value[] = new int[num];for(int i =0;i<nums.length;i++){value[i] = Integer.valueOf(nums[i]);}int m = Integer.valueOf(sc.nextLine());int arr[][] = new int[m][m];for(int i=0;i<m;i++){String arrs[] = sc.nextLine().split(" ");for(int j =0;j<m;j++){arr[i][j] = Integer.valueOf(arrs[j]);}}//  int directions[][] = {{-1,0},{0,-1},{0,1},{1,0}};  // 搜索顺序 很重要,这样第一个结果就是最小值了int directions[][] = {{-1,0},{0,-1},{1,0},{0,1}};  // 搜索顺序 很重要,这样第一个结果就是最小值了boolean hasdata = false;Map<String,List<String>> resultMap = new HashMap<>();List<String> resultValues = new ArrayList<>();for(int i=0;i<m;i++){for(int j=0;j<m;j++){if(arr[i][j] == value[0]){result = i+" "+j;sumResult = String.valueOf(i)+String.valueOf(j);//   System.out.println("first is i"+i+"j "+j);if(dfs(directions,arr,i,j,value,1,m)){hasdata = true;List<String> stringList = new ArrayList<>();stringList.add(result);resultMap.put(sumResult,stringList);resultValues.add(sumResult);break;}}}
//            if(hasdata){
//                break;
//            }}if(hasdata){Collections.sort(resultValues);System.out.println(resultMap.get(resultValues.get(0)).get(0));//  System.out.println(result);}else {System.out.println("error");}}public static boolean dfs(int[][] directions, int[][] arrs, int x, int y, int[] value, int index, int m) {int presentValue = value[index];int i = 0;while (i < 4) {if(i>=4){break;}int newX = x + directions[i][0];int newY = y + directions[i][1];
//            if (newX >= 0 && newX < m && newY >= 0 && newY < m) {
//                System.out.println("newX " + newX + " newY " + newY + " arrs[newX][newY " + arrs[newX][newY] + "presentValue " + presentValue);
//            }if (newX >= 0 && newX < m && newY >= 0 && newY < m && arrs[newX][newY] == presentValue) {result += " " + newX + " " + newY;sumResult = sumResult + String.valueOf(newX) + String.valueOf(newY);if (index == value.length - 1) {return true;}index++;return dfs(directions, arrs, newX, newY, value, index, m);}if (newX < 0 || newX >= m || newY < 0 || newY >= m || arrs[newX][newY] != presentValue) {i++;continue;}}return false;}}

验证结果:

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

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

相关文章

PUBG非升级实用枪皮-部分盘点

藏匿处的黑货箱武器需要耗费高额成本才能升级 对于像我这样的日常休闲玩家来说是一笔不小的&#xff08;巨大的&#xff01;&#xff09;负担 其实有许多普通非升级枪皮也是不错的选择 今天就来盘点一下我自己日常在用的普通皮 来看看你是不是也在用一样的 &#xff08;仅是盘点…

【OceanBase诊断调优】—— 租户资源统计项及其查询方法

本文主要介绍 OceanBase 数据库中租户资源统计项及其查询方法。 适用版本 OceanBase 数据库 V4.1.x、V4.2.x 版本。 CPU 资源统计项 逻辑 CPU 使用率&#xff08;线程处理请求的时间占比&#xff09;。 通过虚拟表 __all_virtual_sysstat 在 SYS 系统租户下&#xff0c;查看…

09.zabbix自定义模块并使用

zabbix自定义模块并使用 根据tcp的11中状态获取值&#xff0c;进行批量配置监控项 [rootyunlong66 ~]# cat /etc/zabbix/zabbix_agentd.d/tcp.conf UserParameterESTABLISHED,netstat -antp |grep -c ESTABLISHED UserParameterSYN_SENT,netstat -antp |grep -c SYN_SENT Use…

Obsidian/Typora设置图床

在obsidian中默认图片是保存在本地的&#xff0c;但是在要导出文档上传到网上时&#xff0c;由于图片保存在本地&#xff0c;会出现无法加载图片的问题。 这里引用的一段话&#xff1a; 这里使用picgo-core和gitee实现图床功能&#xff0c; 参考1&#xff1a; Ubuntu下PicGO配…

Github学习

1.Git与Github 区别: Git是一个分布式版本控制系统&#xff0c;简单的说就是一个软件&#xff0c;用于记录一个或若干个文件内容变化&#xff0c;以便将来查阅特点版本修订情况的软件。 Github是一个为用户提高Git服务的网站&#xff0c;简单说就是一个可以放代码的地方。Gi…

C语言 | Leetcode C语言题解之第85题最大矩形

题目&#xff1a; 题解&#xff1a; int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize) {int m matrixSize;if (m 0) {return 0;}int n matrixColSize[0];int left[m][n];memset(left, 0, sizeof(left));for (int i 0; i < m; i) {for (int j …

SeetaFace6人脸活体检测C++代码实现Demo

SeetaFace6包含人脸识别的基本能力&#xff1a;人脸检测、关键点定位、人脸识别&#xff0c;同时增加了活体检测、质量评估、年龄性别估计&#xff0c;并且顺应实际应用需求&#xff0c;开放口罩检测以及口罩佩戴场景下的人脸识别模型。 官网地址&#xff1a;https://github.co…

【补充】图神经网络前传——DeepWalk

论文阅读 论文&#xff1a;https://arxiv.org/pdf/1403.6652 参考&#xff1a;【论文逐句精读】DeepWalk&#xff0c;随机游走实现图向量嵌入&#xff0c;自然语言处理与图的首次融合_随机游走图嵌入-CSDN博客 abstract DeepWalk是干什么的&#xff1a;在一个网络中学习顶点…

【Mac】Ghost Buster Pro(苹果电脑内存清理专家) v3.2.5安装教程

软件介绍 Ghost Buster pro是一款针对Mac系统的电脑清理和优化工具&#xff0c;可以帮助用户清理系统垃圾、修复注册表错误、卸载不需要的软件、管理启动项等&#xff0c;从而提高系统性能和稳定性。 安装教程 1.打开镜像包&#xff0c;拖动「Ghost Buster Pro」到应用程序中…

【Linux网络】Https【下】{CA认证/证书的签发与认证/安全性/总结}

文章目录 1.引入证书【为方案五铺垫】1.1再谈https1.2SSL/TLS1.3CA机构1.4理解数字签名1.4继续铺垫1.5方案五服务端申请证书回顾一二三回顾方案四方案五过程寻找方案五的漏洞客⼾端对证书进⾏认证 2.查看证书2.1查看浏览器的受信任证书发布机构2.2中间⼈有没有可能篡改该证书2.…

差分约束 C++ 算法例题

差分约束 差分约束 是一种特殊的 n 元一次不等式组&#xff0c;m 个约束条件&#xff0c;可以组成形如下的格式&#xff1a; { x 1 − x 1 ′ ≤ y 1 x 2 − x 2 ′ ≤ y 2 ⋯ x m − x m ′ ≤ y m \begin{cases} x_1-x_1^{} \le y_1 \\ x_2-x_2^{} \le y_2 \\ \cdots \\ x_…

SpringBoot集成jxls2实现复杂(多表格)excel导出

核心依赖 需求 导出多个表格&#xff0c;包含图片&#xff0c;类似商品标签 1.配置模板 创建一个xlsx的模板文件&#xff0c;配置如下 该模板进行遍历了两次&#xff0c;因为我想要导出的数据分为两列展示&#xff0c;左右布局&#xff0c;一个循环实现不了&#xff0c;所以采…

百面算法工程师 | 正则优化函数——BN、LN、Dropout

本文给大家带来的百面算法工程师是正则优化函数&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们将总结一些BN、LN、Dropout的相关知识&#xff0c;并提供参考的回答及其理论基础&#xff0c;以…

C++ | Leetcode C++题解之第85题最大矩形

题目&#xff1a; 题解&#xff1a; class Solution { public:int maximalRectangle(vector<vector<char>>& matrix) {int m matrix.size();if (m 0) {return 0;}int n matrix[0].size();vector<vector<int>> left(m, vector<int>(n, 0)…

【HCIP学习】BGP对等体组、聚合、路由反射器、联盟、团体属性

一、大规模BGP网络所遇到的问题 BGP对等体众多&#xff0c;配置繁琐&#xff0c;维护管理难度大 BGP路由表庞大&#xff0c;对设备性能提出挑战 IBGP全连接&#xff0c;应用和管理BGP难度增加&#xff0c;邻居数量过多 路由变化频繁&#xff0c;导致路由更新频繁 二、解决大…

使用QT-QSqlQuery::value()遇到的问题

在实现客户端间好友添加功能时&#xff0c;我通过以下函数想实现数据库对好友信息的保存 bool OpeDB::handleAddFriend_repound(const char *pername, const char *name) { // pername 被添加方 name 申请添加方 qDebug() << pername << " " &l…

Nginx(简洁版)

基本配置 worker_processes 1; //默认为1&#xff0c;表示开启一个业务进程 events //事件驱动模块&#xff08;&#xff09;{worker_connections 1024; //单个业务进程可接受连接数 } http{include mime.types; // 引入http mime类型&#xff08;在外部已经定义好&#xff0c…

如何在huggingface上申请下载使用llama2/3模型

1. 在对应模型的huggingface页面上提交申请 搜索对应的模型型号 登录huggingface&#xff0c;在模型详情页面上&#xff0c;找到这个表单&#xff0c;填写内容&#xff0c;提交申请。需要使用梯子&#xff0c;country填写梯子的位置吧(比如美国&#xff09; 等待一小时左右…

SEMI启动SiC专有技术项目

公司郑重声明&#xff0c;其正致力于筛选那些能够稳定输出、且可重复使用的关键参数性能。SEMI&#xff0c;这家SiC领域的佼佼者&#xff0c;已经启动了一项独具匠心的专有技术&#xff08;KGD&#xff09;筛选程序。该程序旨在为客户提供高品质的、经过严格电气分类与光学检验…

基于python的旅游爬虫可视化与实现

摘要 本项目为基于python的旅游爬虫可视化的设计与实现&#xff0c;项目以Web系统形式展示&#xff0c;利用Xpath爬虫爬取去哪儿网针对旅游业的需求&#xff0c;对国内热门旅游景点数据可视化系统&#xff0c;将爬取好的数据保存为CSV文件&#xff0c;再通过ORM框架导入MySQL数…