华为OD机试 - 欢乐的周末 - 深度优先搜索dfs算法(Java 2023 B卷 200分)

news2025/1/16 20:14:57

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、深度优先搜索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/1104452.html

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

相关文章

Vue-router快速入门 是什么 如何跳转 如何传值的问题

3.1 Vue-router是什么 Vue-router:Vue.js 的官方路由为 Vue.js 提供富有表现力、可配置的、方便的路由 官网&#xff1a;https://router.vuejs.org/zh/ 作用&#xff1a; 1.实现vue页面(组件)的跳转 2.可以在跳转的时候携带参数 3.2 Vue3使用Vue-router(静态路由) 基于Vu…

PythonOcc + pyqt 显示——stp step文件导入 部件识别 爆炸图展示

使用 occ 7.4.0 版本,pyqt5, 解决了init 缺少window_handle 的问题,另外添加一个左边的显示窗口 import ctypes import logging import os import sysfrom OCC.Display import OCCViewer from PyQt5 import QtCore, QtGui, QtOpenGL, QtWidgets# check if signal available, …

电脑技巧:PrivaZer电脑清理工具介绍(附下载)

今天给大家推荐一款非常实用的电脑垃圾清理工具&#xff0c;感兴趣的朋友可以下载看看&#xff01; 下载&#xff1a;飞猫盘&#xff5c;文件加速传输工具&#xff5c;云盘&#xff5c;橘猫旗下新概念云平台 一、软件介绍 PrivaZer是一款免费好用的老牌清理软件&#xff0c;除…

4.4 网际控制报文协议ICMP

思维导图&#xff1a; 4.4 网际控制报文协议ICMP - 笔记 --- **定义**: - 网际控制报文协议ICMP(Internet Control Message Protocol)是根据[RFC 792]定义的一种协议。它的主要功能是为了提高IP数据报的转发效率和确保交付的成功率。 **主要功能**: 1. **差错报告**: ICMP允…

LeetCode算法位运算—只出现一次的数字

目录 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 补充 异或的重要性质 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 给你一个 非空 整数数组 nums &#xff0c;除了某…

5分钟内在Linux上安装.NET Core应用程序

作为开源的忠实粉丝&#xff0c;我喜欢 .NET Core 的跨平台特性。它开启了无限的可能性&#xff0c;从业余爱好项目、实验和概念验证&#xff0c;到在具有高安全性和可扩展性的经济高效基础设施上运行的大规模高负载生产应用程序。我通常从任何云平台提供商那里获得最简单、最便…

页面打印功能,单选框多选框选中后,打印时不显示选中效果

使用antdv&#xff0c;或者element-ui时&#xff0c;如果对页面进行打印&#xff0c;存在单选&#xff0c;多选样式无法显示的情况&#xff0c;在打印预览界面--》更多设置中&#xff0c;背景图形选中就可以了。

linux挂载数据盘后格式化添加挂点

df -h 查看磁盘大小时&#xff0c;未格式化的磁盘无法查看&#xff0c;可以通过 fdisk -l 命令查看 如果这里看不到数据盘&#xff0c;有可能是数据盘没有挂载到服务器上&#xff0c;可以参考阿里云挂载数据盘操作&#xff0c; 已挂载的数据盘进行格式化创建文件系统&#xff…

《算法通关村第一关——链表经典问题之两个链表的第一个公共子节点问题笔记》

《算法通关村第一关——链表经典问题之两个链表的第一个公共子节点问题笔记》 问题描述 输入两个链表&#xff0c;找出他们的第一个公共节点。 例如下面的两个链表 两个链表的头节点都是已知的&#xff0c;相交之后成为一个单链表&#xff0c;但是相交的位置未知&#xff0c…

leaflet地图线段和区域的回显

线段回显 searchLineArr: [], // 存放搜索到的路段或者道路的线段drawSearchLineArr(line) {/* 移除线段 */this.searchLineArr.forEach((polyline) > {polyline.remove();});this.searchLineArr []/* 移除线段 */this.map.panTo(JSON.parse(line)[0]); // 地图视图移动到线…

Java扫雷游戏总结 (小项目)

【尚学堂Java开发扫雷游戏项目】1个半小时做出java扫雷小游戏_java小游戏_Java游戏开发_Java练手项目_java项目实战_java初级项目_哔哩哔哩_bilibili 前言&#xff1a; 记录的是大致的写代码过程为了视觉上更清晰&#xff0c;下面只是放出了完成该功能的核心代码&#xff0c;把…

分享Java NET Python三大技术下AutojsPro7云控代码

引言 有图有真相&#xff0c;那短视频就更是真相了。下面是三大语言的短视频。 Java源码版云控示例&#xff1a; Java源码版云控示例在线视频 Net源码版云控示例&#xff1a; Net源码版云控示例在线视频亚丁号-知识付费平台 支付后可见 扫码付费可见 Python源码版云控示例&…

【容器】Docker(学习笔记)

一、初识Docker 1、Docker概述 Docker 是一个开源的应用容器擎。 诞生于 2013 年初&#xff0c;基于 Go 语言实现&#xff0c;dotcloud 公司出品&#xff08;后改名为Docker Inc&#xff09;。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&a…

【小黑嵌入式系统第三课】嵌入式系统硬件平台(一)——概述、总线、存储设备(RAMROMFLASH)

上一课&#xff1a; 【小黑嵌入式系统第二课】嵌入式系统的概述&#xff08;二&#xff09;——外围设备、处理器、ARM、操作系统 文章目录 一、概述二、总线1. 总线的概念1.1 总线结构1.2 总线类型1.2.1 数据总线1.2.2 程序总线1.2.3 数据地址总线1.2.4 程序地址总线 2. 总线协…

new Object()到底占用几个字节

Java内存模型 对象内存中可以分为三块区域&#xff1a;对象头(Header)&#xff0c;实例数据(Instance Data)和对齐填充(Padding)&#xff0c;以64位操作系统为例(未开启指针压缩的情况)Java对象布局 如下图所示&#xff1a; 其中对象头中的Mark Word中的详细信息在文章synchr…

地下水与饮用水提标处理树脂

随着饮用水和地下水污染物检测技术水平的不断提高&#xff0c;世界各国管理机构跟踪监测的水体污染数目也不断增加。近年来&#xff0c;针对砷、高氯酸盐和铀等水体污染物&#xff0c;新的强化控制措施不断的付诸实施。此外&#xff0c;用氯化物及其衍生物进行水体消毒会带来诸…

leetcode 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些…

【ajax】withCredentials

默认值&#xff1a;false。在获取同域资源时设置 withCredentials 没有影响。 true&#xff1a;在跨域请求时&#xff0c;会携带用户凭证 false&#xff1a;在跨域请求时&#xff0c;不会携带用户凭证&#xff1b;返回的 response 里也会忽略 cookie ajax中的作用 跨域请求时…

药物滥用第一篇介绍

AMP&#xff1a; Ampicillin&#xff0c;中文名氨苄青霉素&#xff0c;同义名氨苄西林&#xff0c;一种β-内酰胺类抗生素&#xff0c;属于青霉素家族的一员&#xff0c;化学式为C16H19N3O4S&#xff0c;可治疗多种细菌感染。 氨苄西林为半合成的广谱青霉素&#xff08;结构如上…

基于单片机设计的家用自来水水质监测装置

一、前言 本文介绍基于单片机设计的家用自来水水质监测装置。利用STM32F103ZET6作为主控芯片&#xff0c;结合水质传感器和ADC模块&#xff0c;实现对自来水水质的检测和监测功能。通过0.96寸OLED显示屏&#xff0c;将采集到的水质数据以直观的方式展示给用户。 随着人们对健…