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

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、深度优先搜索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;// 如果没有满足条件的,直接输出0if (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.hqwc.cn/news/60093.html

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

相关文章

商用服务机器人公司【Richtech Robotics】申请纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国内华达州拉斯维加斯由华人领导的商用服务机器人公司【Richtech Robotics】近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&am…

Gpt微信小程序搭建的前后端流程 - 前端小程序部分-2.确定交互所需的后端API(二)

Gpt微信小程序搭建的前后端流程 - 前端小程序部分-2.确定交互所需的后端API(二) 参考微信小程序-小柠AI智能聊天&#xff0c;可自行先体验。 根据上一节的小程序静态页面设计&#xff0c;需要从后端获取数据的主要4个点&#xff1a; 登录流程&#xff1b;获取今日已提问次数&a…

第二课-一键安装SD-Stable Diffusion 教程

前言 看完这篇文章并跟着操作,就可以在本地开始 SD 绘图了。 理论上来说,这篇课程结束,想要画什么图都可以画了。 启动器介绍 SD 是开源的,可以在 github 上找到。但直接下载源码安装,非常费劲,而且因为国内外差异,就是我这样的秃头程序员也难以应对。 所以,我们改…

DeepSort算法简介

SORT算法 SORT(Simple Online and Realtime Tracking)算法是一种目标追踪算法&#xff0c;其简单有效&#xff0c;基于IOU来匹配&#xff0c;并且融入了卡尔曼滤波和匈牙利算法来降低ID Switch(可以说&#xff0c;追踪算法的目标只有两个&#xff1a;1.提高速度 2.降低ID Swit…

嵌入式开发的学习与未来展望:借助STM32 HAL库开创创新之路

引言&#xff1a; 嵌入式开发作为计算机科学领域的重要分支&#xff0c;为我们的日常生活和产业发展提供了无限的可能。STMicroelectronics的STM32系列芯片以其出色的性能和广泛的应用领域而备受关注。而STM32 HAL库作为嵌入式开发的高级库&#xff0c;为学习者提供了更高效、更…

在 Ubuntu 上安装 Docker 桌面

Ubuntu 22.04 (LTS) 安装 Docker 桌面 要成功安装 Docker Desktop&#xff0c;您必须&#xff1a; 满足系统要求拥有 64 位版本的 Ubuntu Jammy Jellyfish 22.04 (LTS) 或 Ubuntu Impish Indri 21.10。对于非 Gnome 桌面环境&#xff0c;必须安装 gnome-terminal&#xff1a;…

ApplicationContext在Spring Boot中是如何创建的?

一、ApplicationContext在Spring Boot中是如何创建的&#xff1f; 1. SpringApplication ApplicationContextFactory有三个实现类&#xff0c;分别是AnnotationConfigReactiveWebServerApplicationContext.Factory、AnnotationConfigServletWebServerApplicationContext.Facto…

keil显示中文代码正常,但是编译中文乱码的问题

Configuration---Editor---Encoding&#xff0c;ANSI或是UTF8&#xff0c;总之这2个&#xff0c;是A就改为U&#xff0c;是U就改为A。 MDK5中文编译乱码&#xff0c;不是显示乱码哦。

计蒜客T1115——字符串判等

水题不解释&#xff0c;考研复习压力偶尔写一道换换心情还不错~ 这里有一个比较有趣的知识点&#xff0c;对于同时输入多个字符串时还要允许空格的输入&#xff0c;那么普通的cin函数就不能满足要求了&#xff0c;这里采用getline函数解决&#xff0c;如下&#xff1a; string …

贪心-leetcode409最长回文串

贪心-leetcode409最长回文串 思考&#xff1a; 总的思路&#xff1a;从数字中选择个数是偶数的去union&#xff0c;最后如果有过奇数则多union一个作为中心&#xff1b;从数组中select然后feasible是如果该数字为偶数则union到两边&#xff0c;如果为奇数则按照偶数处理再给中…

LoRaWAN网关与网络服务器(NS)的通信LNS协议介绍

将 LoRaWAN网关连接到 LoRaWAN 网络服务器 (LNS) 是一个两步过程,该过程使用 WebSocket 作为传输协议来交换包含 JSON 编码对象的文本记录。 首先,网关向LNS查询LNS实际连接端点的URI。其次,它与该端点建立数据连接以接收设置信息。从那时起,LoRa 上行链路和下行链路帧通过…

fastadmin、vue、react图标库适用于多种框架

在二开fastadmin中&#xff0c;在写vue以及react时&#xff0c;侧边导航栏以及按钮中常常需要很多图标&#xff0c;那么这些图标应该去哪里得到呢&#xff0c;在这里给大家一个链接&#xff0c;这里有丰富的图标库&#xff0c;可以找到自己想要的进行使用。 点击下方链接&…