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

    }

}

验证结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot设计模式之创建型设计模式·工厂方法模式

文章目录 介绍开始架构图样例一定义工厂定义具体工厂&#xff08;上衣、下装&#xff09;定义产品定义具体生产产品&#xff08;上衣、下装&#xff09; 测试样例 总结优点缺点与抽象工厂不同点 介绍 在 Factory Method模式中&#xff0c;父类决定实例的生成方式&#xff0c;但…

用红黑树封装出map与set

目录 一、红黑树的改造 节点结构的定义 迭代器类的实现 红黑树中提供迭代器 红黑树的主要代码 二、set的实现 三、map的实现 四、测试代码 map与set的底层都是红黑树&#xff0c;所以本篇文章就分享如何用同一颗红黑树封装出map与set 所以大家可以先去看一下我的讲解红…

第一个fyne应用

第一个fyne应用 由于在写一个milvus的图形化工具&#xff0c;方便客户端使用&#xff0c;调研了一下只有这fyne的go-gui的star最多&#xff0c;比较流行&#xff0c;因此打算使用这个框架来进行milvus的工具开发。 第一个fyne应用 依赖go.mod: module fynedemogo 1.20requi…

【自然语言处理】【大模型】DeepSeek-V2论文解析

论文地址&#xff1a;https://arxiv.org/pdf/2405.04434 相关博客 【自然语言处理】【大模型】DeepSeek-V2论文解析 【自然语言处理】【大模型】BitNet&#xff1a;用1-bit Transformer训练LLM 【自然语言处理】BitNet b1.58&#xff1a;1bit LLM时代 【自然语言处理】【长文本…

k8s环境部署的集成arthas-spring-boot-starter spingboot项目无法访问控制台

前言 k8s环境部署的集成arthas-spring-boot-starter项目无法访问控制台&#xff0c;springboot项目集成arthas-spring-boot-starter 会自带个控制台 供我们访问 但是当使用k8s环境部署后 这个页面就无法访问了 分析 首先看下arthas对应的配置 arthas-spring-boot-starter 中…

数据结构(C):树的概念和二叉树初见

目录 &#x1f37a;0.前言 1.树概念及结构 2.认识一棵树 3.树的表示 3.1树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 4.二叉树 4.1特殊的二叉树 4.2二叉树的性质 &#x1f48e;5.结束语 &#x1f37a;0.前言 言C之言&#xff0c;聊C之识&…

先有JVM还是先有垃圾回收器?很多人弄混淆了

是先有垃圾回收器再有JVM呢&#xff0c;还是先有JVM再有垃圾回收器呢&#xff1f;或者是先有垃圾回收再有JVM呢&#xff1f;历史上还真是垃圾回收更早面世&#xff0c;垃圾回收最早起源于1960年诞生的LISP语言&#xff0c;Java只是支持垃圾回收的其中一种。下面我们就来刨析刨析…

实验三:机器学习1.0

要求&#xff1a; 针对实验1和实验2构建的数据集信息分析 设计实现通过数据简介进行大类分类的程序 代码实现&#xff1a; 训练集数据获取&#xff1a; read_data.py import json import pickledef read_intro():data []trypathr"E:\Procedure\Python\Experiment\f…

【计算机毕业设计】springboot城市公交运营管理系统

二十一世纪我们的社会进入了信息时代&#xff0c; 信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

wefaf

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

算法学习(7)-树

目录 开启“树”之旅 二叉树 堆--优先队列 并查集 开启“树”之旅 是不是很像一棵倒挂的树&#xff1f;也就是说它是根朝上&#xff0c; 而叶子朝下的。不像&#xff1f;哈哈&#xff0c;来看看下面的图你就会觉得像啦。 你可能会间&#xff1a; 树和图有什么区别&#xff…

纯血鸿蒙APP实战开发——Worker子线程中解压文件

介绍 本示例介绍在Worker 子线程使用ohos.zlib 提供的zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作&#xff0c;解压成功后将解压路径返回主线程&#xff0c;获取解压文件列表。 效果图预览 使用说明 点击解压按钮&#xff0c;解压test.zip文件&#xff0c;显…

ArcGIS10.X入门实战视频教程(arcgis入门到精通)

点击学习&#xff1a; ArcGIS10.X入门实战视频教程&#xff08;GIS思维&#xff09;https://edu.csdn.net/course/detail/4046?utm_sourceblog2edu 点击学习&#xff1a; ArcGIS10.X入门实战视频教程&#xff08;GIS思维&#xff09;https://edu.csdn.net/course/detail/404…

用SwitchHosts模拟本地域名解析访问

一.用SwitchHosts模拟本地域名解析访问 1.下载地址 https://download.csdn.net/download/jinhuding/89313168 2.使用截图

Python自动化SQL注入和数据库取证工具库之sqlmap使用详解

概要 在网络安全领域,SQL注入仍然是最常见的攻击之一。sqlmap是一个开源的自动化SQL注入和数据库取证工具,它提供了广泛的功能来检测和利用SQL注入漏洞。本文将详细介绍sqlmap的安装、特性、基本与高级功能,并结合实际应用场景,展示其在网络安全测试中的应用。 安装 sqlm…

激光打标机:手机制造中不可或缺的加工设备

激光打标机在手机行业中有多种应用&#xff0c;主要体现在以下几个方面&#xff1a; 1. 手机外壳打标&#xff1a;光纤激光打标机在手机外壳上打标的痕迹非常美观&#xff0c;可以印上厂家品牌标识&#xff0c;既保证了手机外壳的美观&#xff0c;也提高了产品的打标质量和加工…

云曦实验室期中考核题

Web_SINGIN 解题&#xff1a; 点击打开环境&#xff0c;得 查看源代码&#xff0c;得 点开下面的超链接&#xff0c;得 看到一串base64编码&#xff0c;解码得flag 简简单单的文件上传 解题&#xff1a; 点击打开环境&#xff0c;得 可以看出这是一道文件上传的题目&#x…

2024年最新软件测试面试题必问的1000题!

我了解的测试理论和方法包括以下几个方面&#xff1a; 黑盒测试与白盒测试&#xff1a; 黑盒测试&#xff1a;基于对软件系统外部行为进行测试&#xff0c;独立于内部代码实现细节。黑盒测试关注输入与输出之间的关系以及软件功能是否符合预期。白盒测试&#xff1a;基于对软件…

搭载全新升级viaim AI,讯飞会议耳机Pro 2首销价1399元起

2024年5月15日&#xff0c;人工智能硬件公司未来智能发布了讯飞会议耳机Pro 2、iFLYBUDS 2以及Kit 2三款旗舰新品&#xff0c;为用户带来全新升级的viaim AI&#xff0c;也为AIGC智能耳机树立了新标杆。 在发布会上&#xff0c;未来智能CEO马啸表示&#xff1a;在AIGC领域&…

基于EBAZ4205矿板的图像处理:05均值滤波算法

基于EBAZ4205矿板的图像处理&#xff1a;05均值滤波算法 项目全部文件已经上传&#xff0c;是免费的 先看效果 可以明显看到图像变糊了&#xff0c;这就是均值滤波的特点&#xff0c;将噪声均摊到每个点上的同时&#xff0c;也会让图像丢失细节。 算法讲解 均值滤波&#x…