华为OD机试真题 Java 实现【欢快的周末】【2023 B卷 100分】,深度优先搜索dfs算法

news2024/9/20 5:57:05

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、深度优先搜索dfs
    • 五、解题思路
    • 六、Java算法源码
    • 七、效果展示
      • 1、输入
      • 2、输出
      • 3、说明
      • 4、如果修改一下呢?
      • 5、来,TFBOYS,试一下?

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

小华和小为是很要好的朋友,他们约定周末一起吃饭。

通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达),求小华和小为都能到达的聚餐地点有多少个?

二、输入描述

第一行输入m和n,m代表地图的长度,n代表地图的宽度。

第二行开始具体输入地图信息,地图信息包含:

  • 0为通畅的道路
  • 1为障碍物(仅1为障碍物)
  • 2为小华或者小为,地图中必定有且仅有2个(非障碍物)
  • 3为被选中的聚餐地点(非障碍物)

三、输出描述

求小华和小为都能到达的聚餐地点有多少个?

在这里插入图片描述

四、深度优先搜索dfs

在我们遇到的一些问题当中,有些问题我们不能够确切的找出数学模型,即找不出一种直接求解的方法,解决这一类问题,我们一般采用搜索的方法解决。搜索就是用问题的所有可能去试探,按照一定的顺序、规则,不断去试探,直到找到问题的解,试完了也没有找到解,那就是无解,试探时一定要试探完所有的情况(实际上就是穷举);

对于问题的第一个状态,叫初始状态,要求的状态叫目标状态。
搜索就是把规则应用于实始状态,在其产生的状态中,直到得到一个目标状态为止。
产生新的状态的过程叫扩展(由一个状态,应用规则,产生新状态的过程)。

搜索的要点:

  1. 初始状态;
  2. 重复产生新状态;
  3. 检查新状态是否为目标,是结束,否转(2);

如果搜索是以接近起始状态的程序依次扩展状态的,叫宽度优先搜索。

如果扩展是首先扩展新产生的状态,则叫深度优先搜索。

深度优先搜索用一个数组存放产生的所有状态。

  1. 把初始状态放入数组中,设为当前状态;
  2. 扩展当前的状态,产生一个新的状态放入数组中,同时把新产生的状态设为当前状态;
  3. 判断当前状态是否和前面的重复,如果重复则回到上一个状态,产生它的另一状态;
  4. 判断当前状态是否为目标状态,如果是目标,则找到一个解答,结束算法;
  5. 如果数组为空,说明无解。

五、解题思路

求小华和小为都能到达的聚餐地点有多少个?

转成大白话就是,问有几个3可以满足两个2可以同时到达。

  1. 第一行输入地图的长度m,即m行,地图的宽度n,即n列;
  2. 第二行开始具体输入地图信息;
  3. 地图信息初始化;
  4. 利用深度优先搜索dfs算法,获取符合要求的餐馆;
  5. 定义okNum,记录小华和小为都能到达的聚餐地点有多少个;
  6. 如果没有满足条件的,直接输出0;
  7. 如果存在满足条件的餐馆3,则输出都能到达的聚餐地点个数;

六、Java算法源码

package com.guor.od;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class OdTest02 {
    static final int N = 110;
    // 地图信息
    static int[][] arr = new int[N][N];
    static Map<String, Integer> map1 = new HashMap<>();
    static Map<String, Integer> map2 = new HashMap<>();
    static int[] arrX = new int[]{-1, 0, 1, 0};
    static int[] arrY = new int[]{0, 1, 0, -1};
    // 地图的长度
    static int m;
    // 地图的宽度
    static int n;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 地图的长度,即m行
        m = sc.nextInt();
        // 地图的宽度,即n列
        n = sc.nextInt();
        int[] positionArr = new int[4];
        // 地图信息初始化
        for (int i = 0, k = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                arr[i][j] = sc.nextInt();
                if (arr[i][j] == 2) {
                    positionArr[k++] = i;
                    positionArr[k++] = j;
                }
            }
        }

        dfs(positionArr[0], positionArr[1], map1);
        dfs(positionArr[2], positionArr[3], map2);

        // 小华和小为都能到达的聚餐地点有多少个
        int okSum = 0;
        // 如果没有满足条件的,直接输出0
        if (map1.size() == 0 || map2.size() == 0) {
            System.out.println(0);
        } else {
            for (Map.Entry<String, Integer> entry : map1.entrySet()) {
                String key = entry.getKey();
                if (map2.containsKey(key)) {
                    okSum++;
                }
            }
            System.out.println(okSum);
        }
    }

    /**
     * 利用深度优先搜索dfs算法,获取敌人数小于K的区域数量
     */
    public static void dfs(int x, int y, Map<String, Integer> map) {
        if (arr[x][y] == 3) {
            String key = get(x, y);
            map.put(key, map.getOrDefault(key, 0) + 1);
            return;
        }
        int k = arr[x][y];
        arr[x][y] = -1;
        for (int i = 0; i < 4; i++) {
            int a = arrX[i] + x, b = arrY[i] + y;
            if (a >= 0 && a < m && b >= 0 && b < n && arr[a][b] != 1 && arr[a][b] != -1 && !map.containsKey(get(a, b))) {
                dfs(a, b, map);
            }
        }
        arr[x][y] = k;
    }

    public static String get(int x, int y) {
        return String.valueOf(x) + "@" + String.valueOf(y);
    }
}

七、效果展示

1、输入

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

2、输出

4

3、说明

6行5列。

  • 0为通畅的道路
  • 1为障碍物(仅1为障碍物)
  • 2为小华或者小为,地图中必定有且仅有2个(非障碍物)
  • 3为被选中的聚餐地点(非障碍物)

求小华和小为都能到达的聚餐地点有多少个?

转成大白话就是,问有几个3可以满足两个2可以同时到达。

在这里插入图片描述

4、如果修改一下呢?

卫生不达标,将通往右上角的餐馆道路锁死。

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

在这里插入图片描述
右眼可见,会输出2。

在这里插入图片描述

5、来,TFBOYS,试一下?


🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

Ubuntu类IOS主题设置

1.依次执行下面三条命令&#xff1a; sudo apt install gnome-shell-extensions sudo apt install gnome-tweak-tool sudo apt install chrome-gnome-shell2.下载主题&#xff0c;也是命令&#xff1a; git clone <https://github.com/qingchendelaike/GNOME-OSX-II-Theme…

VGGNet剪枝实战:使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型(二)

文章目录 稀疏训练VGGNet剪枝导入库文件测试函数定义全局参数BN通道排序制作Mask剪枝操作 微调微调方法微调结果 稀疏训练VGGNet 新建train_sp.py脚本。稀疏化训练的过程和正常训练类似&#xff0c;不同的是在BN层中各权重加入稀疏因子&#xff0c;代码如下&#xff1a; def …

通达OA前台getshell

你永远要记住&#xff0c;你跟别人不一样&#xff0c;你是一个有另外世界的人 漏洞复现 访问网站url&#xff1a; 将exp中的target替换为目标url Payload替换为自己的木马即可 ​关键exp如下&#xff1a; 执行exp漏洞利用&#xff0c;中间过程会询问是否删除文件&#x…

Mysql load data隐藏字符特殊字符ESC的方法

mysqlimport --userroot --passwordroot1234 --default-character-setutf8 --fields-terminated-by"$(echo -ne \033)" --lines-terminated-by\n --local shenl /root/xab.dat https://jisuan5.com/ascii/ ascii码值 SHOW GLOBAL VARIABLES LIKE local_infile; LO…

微服务Ribbon-负载均衡原理

目录 一、LoadBalancerIntercepor 二、LoadBalancerClient 三、负载均衡策略IRule 四、总结 上一篇中&#xff0c;我们添加了LoadBalanced注解&#xff0c;即可实现负载均衡功能&#xff0c;这是什么原理呢&#xff1f; SpringCloud底层其实是利用了一个名为Ribbon的组件&…

SpringBoot学习——springboot整合email springboot整合阿里云短信服务

目录 引出springboot整合email配置邮箱导入依赖application.yml配置email业务类测试类 springboot整合阿里云短信服务申请阿里云短信服务测试短信服务获取阿里云的accessKeyspringboot整合阿里云短信导包工具类 总结 引出 1.springboot整合email&#xff0c;qq邮箱&#xff0c;…

计算机网络实验3:双绞线跳线的制作和测试

文章目录 1. 主要教学内容2. 双绞线跳线的制作和测试 1. 主要教学内容 实验内容&#xff1a;掌握双绞线制作过程中的剥线、理线、插线、压线以及测线。所需学时&#xff1a;2。重难点&#xff1a;双绞线的类别及其用途周次&#xff1a;第2周。教材相关章节&#xff1a;第5章&a…

Android Studio实现Spinner下拉列表

效果图 点击下拉列表 点击某一个下拉列表 MainActivity package com.example.spinneradapterpro;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.Spinn…

怎样的公司称为集团?

集团是什么&#xff1f; 集团的意思是有目的组织起来共同行动的团体。企业集团不具有独立的法人资格。《公司法》中并没有“集团”一说。只有有限责任公司和股份有限公司的提法。有的公司进行多元化经营战略&#xff0c;在多个领域均成立了相应的子公司&#xff0c;这样&#…

【递归算法实践】验证二叉搜索树

目录 1. 递归算法 2. 递归实现验证二叉搜索树 3. 递归解法的实现逻辑 4. 递归实现的实例分析 1. 递归算法 递归是一种通过函数自身调用来解决问题的算法&#xff0c;它可以使代码更加简洁和优雅&#xff0c;同时也能够解决许多复杂的问题。在递归中&#xff0c;函数会不断…

【Windows10下启动RocketMQ报错:找不到或无法加载主类 Files\Java\jdk1.8.0_301\lib\dt.jar】解决方法

Windows10下启动RocketMQ报错&#xff1a;找不到或无法加载主类 一、问题产生二、产生原因三、解决办法 一、问题产生 参考RocketMQ Github官网上的说明&#xff0c;下载rocketmq-all-5.1.3-bin-release.zip&#xff0c;解压配置环境变量后&#xff0c;执行如下命令&#xff1a…

基于2.4G RF开发的无线游戏手柄解决方案

平时喜欢玩游戏的朋友&#xff0c;肯定知道键鼠在某些类型的游戏适配和操作方面&#xff0c;不如手柄。作为一个游戏爱好者&#xff0c;还得配上一个游戏手柄才行。比如动作和格斗、体育游戏&#xff0c;由于手柄更合理的摇杆位置和按键布局&#xff0c;操作起来也是得心应手。…

6.pip简介,第三方库的安装

引言 使用过Visual Studio的小伙伴可能对npm不陌生&#xff0c;没错&#xff0c;pip与npm的功能是一样的。 首先要知道&#xff0c;Python这门语言拥有着丰富的标准库以及先辈们开发的各种功能强大的第三方库。而今天我们主要学习的呢就是关于Python中的包管理工具。它是Pytho…

图像的镜像变换之c++实现(qt + 不调包)

1.基本原理 1.水平镜像变化 设图像的宽度为width&#xff0c;则水平镜像变化的映射关系如下&#xff1a; 2.垂直镜像变化 设图像的宽度为height&#xff0c;则垂直镜像变化的映射关系如下&#xff1a; 2.代码实现&#xff08;代码是我以前自学图像处理时写的&#xff0c;代码很…

VS Code安装使用教程

目录 1. VS Code是什么&#xff1f; 2. VS Code的下载和安装 下载&#xff1a; 安装&#xff1a; 2.2 环境的介绍 3. VS Code配置C/C开发环境 3.1 下载和配置MinGW-w64编译器套件 下载&#xff1a; 配置&#xff1a; 3.2 安装C/C插件 3.3 重启VSCode 4. 在VSCode上编…

如何快速创建学校录取查询系统?

作为一名老师&#xff0c;我深知学生及家长们对于录取情况的关注和期待。因此&#xff0c;学校公布录取情况表是非常重要的一项工作。在这篇文章中&#xff0c;我将分享学校公布录取情况表的步骤和流程&#xff0c;帮助大家更好地了解录取情况。 老教师一般是使用易查分来让家…

坤简炫酷的JQuery轮播图插件

介绍&#xff1a; 找到了一个炫酷的JQuery轮播图插件&#xff0c;只需要配置三四行代码就可以实现很多二维三维炫酷的切换效果。 视频效果及教程&#xff1a; https://www.bilibili.com/video/BV1Fu4y1d776/ 代码&#xff1a; https://github.com/w-x-x-w/AwesomeWeb 使用…

[软件工具][原创]OCR识字找图关键词找图以文搜图工具使用教程

OCR识字找图工具功能简介&#xff1a; 当你有一批图片但是想提取图片里面包含关键词的的图片&#xff0c;以前都是手工肉眼打开去找&#xff0c;其实这个大可不必&#xff0c;现在只需输入关键词&#xff0c;软件会自动搜索所有图片&#xff0c;只要包含指定关键词就会复制或者…

【雕爷学编程】Arduino动手做(199)---8x32位WS2812B全彩屏模块

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

【12】Git工具 协同工作平台使用教程 【Gitee】【腾讯工蜂】

tips&#xff1a;少量的git安装和使用教程&#xff0c;更多讲快速使用上手Gitee和工蜂平台 一、准备工作 1、下载git Git - Downloads (git-scm.com) 找到对应操作系统&#xff0c;对应版本&#xff0c;对应的位数 下载后根据需求自己安装&#xff0c;然后用git --version验…