[华为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;查看…

AtCoder Beginner Contest 308 A题 New Scheme

A题&#xff1a;New Scheme 标签&#xff1a;模拟 题意&#xff1a;给定 8 8 8个数的序列&#xff0c;询问这些数是否满足以下条件&#xff1a; 在 100 100 100到 675 675 675之间且能被 25 25 25整除序列是单调非递减的 题解&#xff1a;按题意模拟判断就好了。 代码&#…

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」到应用程序中…

GIT SSL certificate problem

简单来说&#xff0c;SSL 协议可以为你的 Web 浏览器或其他进程提供一种安全的通道&#xff0c;使服务器和客户端之间的数据传输过程不被第三方窃取或篡改。这非常重要&#xff0c;特别是在处理敏感数据&#xff0c;比如信用卡信息、用户名和密码等情况下。 现在&#xff0c;S…

Flutter 中的 Row 小部件:全面指南

Flutter 中的 Row 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;Row 是一个水平布局的小部件&#xff0c;用于将子控件沿着水平轴排列。Row 类似于 HTML 中的 div 标签&#xff0c;但仅限于水平布局。它非常适合用来创建行式布局&#xff0c;如表单输入、按钮组、标签…

【linux软件基础知识】完全公平调度

完全公平调度&#xff08;CFS&#xff09; CFS根据每个进程相对于所有可运行线程总权重的权重为每个进程分配一个“时间片”。 CFS 的目标是近似“无限小”的调度持续时间&#xff0c;称为目标延迟。 较小的目标延迟可以提高交互性并接近完美的多任务处理&#xff0c;但其代价…

【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_…

数据库的要求

本来我是不准备写数据库的。而且是准备从零开始&#xff0c;学习python&#xff0c;学完语言学&#xff0c;会c和写作技法&#xff0c;再来学习数据库 那样做的复杂度是天量的&#xff0c;按部就班什么的具备&#xff0c;因为你完全不清楚什么时候就有这个基础和条件&#xff0…

【53】Camunda8-Zeebe核心引擎-Partitions分区与Internal processing内部处理

Partitions分区 在Zeebe中,所有数据都是基于分区的。(一个)分区本质上是一个关于流程事件的持久化流。在broker集群中,分区分布在节点之间,因此可以将其视为分片。启动/初始化Zeebe 集群时,用户可以配置所需的分区数。如果使用过Kafka,这部分内容是比较相似的。 每当部…

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

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

【ARM64 常见汇编指令学习 20.1 -- ARM 伪指令 .include】

请阅读【嵌入式开发学习必备专栏】 文章目录 ARM 编译指令 .include 使用介绍a.s 文件b.s 文件小结 ARM 编译指令 .include 使用介绍 在UEFI&#xff08;统一可扩展固件接口&#xff09;开发中&#xff0c;通常会用到汇编语言文件&#xff08;.s 或 .S 文件&#xff09;。如果…

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

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