华为OD机试 - 聚餐地点 - 广度优先搜索BFS(Java 2024 D卷 200分)

news2025/1/21 2:47:48

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

小华和小为是很好的朋友,他们约定周末一起吃饭,通过手机交流,他们在地图上选择了很多聚餐地点 (由于自然地形等原因,部分聚餐地点不可达),求小华和小为都能达到的聚餐地点有多少个。

二、输入描述

第一行输入 m 和 n,m 表示地图长度,n 表示地图宽度

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

0 为通畅的道路

1 为障碍物(且仅 1 为障碍物)

2 为小华或小为,地图中必定有且仅有两个(非障碍物)

3 为被选中的聚餐地点(非障碍物)

三、输出描述

可以两方都到达的聚餐地点的数量,行末无空格。

补充说明

地图长宽为m和n,4 <= m <= 100 ,4 <= n <= 100

聚餐的地点数量为k,则1 < k <= 100

四、解题思路

本题要求我们在一个二维地图上找到小华和小为都能到达的聚餐地点。我们可以通过广度优先搜索(BFS)从小华和小为的起始位置分别进行搜索,记录每个可达位置。最后统计两者都能到达的聚餐地点数量。

具体步骤如下:

  1. 读取输入:
    • 读取地图的长宽 m 和 n。
    • 读取地图信息,记录小华和小为的起始位置,以及聚餐地点的位置。
  2. 广度优先搜索(BFS):
    • 从小华和小为的起始位置分别进行BFS,记录每个可达的位置。
    • 使用一个布尔矩阵 visited1 记录小华能到达的位置,使用 visited2 记录小为能到达的位置。
  3. 统计结果:
    • 遍历聚餐地点的位置,统计小华和小为都能到达的地点数量。

五、Java算法源码

public class Test01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取地图的长和宽
        int m = scanner.nextInt();
        int n = scanner.nextInt();
        scanner.nextLine();

        // 初始化地图
        int[][] map = new int[m][n];
        int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        int[] start1 = new int[2];
        int[] start2 = new int[2];
        LinkedList<int[]> meetingPoints = new LinkedList<>();

        int startIndex = 0;
        // 读取地图信息
        for (int i = 0; i < m; i++) {
            String[] row = scanner.nextLine().split(" ");
            for (int j = 0; j < n; j++) {
                map[i][j] = Integer.parseInt(row[j]);
                if (map[i][j] == 2) {
                    // 记录小华和小为的起始位置
                    if (startIndex == 0) {
                        start1[0] = i;
                        start1[1] = j;
                        startIndex++;
                    } else {
                        start2[0] = i;
                        start2[1] = j;
                    }
                } else if (map[i][j] == 3) {
                    // 记录聚餐地点
                    meetingPoints.add(new int[]{i, j});
                }
            }
        }
        scanner.close();

        // 执行广度优先搜索(BFS),记录小华和小为分别能到达的地点
        boolean[][] visited1 = bfs(map, start1, m, n, directions);
        boolean[][] visited2 = bfs(map, start2, m, n, directions);

        int commonPoints = 0;
        // 统计小华和小为都能到达的聚餐地点数量
        for (int[] point : meetingPoints) {
            if (visited1[point[0]][point[1]] && visited2[point[0]][point[1]]) {
                commonPoints++;
            }
        }

        // 输出结果
        System.out.println(commonPoints);
    }

    /**
     * 广度优先搜索(BFS)函数,记录从起始位置能到达的所有位置
     * @param map 地图矩阵
     * @param start 起始位置
     * @param m 地图的行数
     * @param n 地图的列数
     * @param directions 移动的四个方向
     * @return 记录能到达的位置的布尔矩阵
     */
    private static boolean[][] bfs(int[][] map, int[] start, int m, int n, int[][] directions) {
        boolean[][] visited = new boolean[m][n]; // 记录访问过的位置
        Queue<int[]> queue = new LinkedList<>();
        queue.add(start);
        visited[start[0]][start[1]] = true;

        // 广度优先搜索
        while (!queue.isEmpty()) {
            int[] current = queue.poll();
            for (int[] direction : directions) {
                int newRow = current[0] + direction[0];
                int newCol = current[1] + direction[1];
                // 检查新位置是否在地图范围内,是否未访问过,且不是障碍物
                if (newRow >= 0 && newRow < m && newCol >= 0 && newCol < n && !visited[newRow][newCol] && map[newRow][newCol] != 1) {
                    queue.add(new int[]{newRow, newCol});
                    visited[newRow][newCol] = true;
                }
            }
        }

        return visited;
    }
}

六、效果展示

1、输入

4 4
2 1 0 3
0 1 2 1
0 3 0 0
0 0 0 0

2、输出

2

3、说明

第一行输入地图的长宽为4和4

第二行开始为具体的地图,其中:

3 代表小华和小明的聚餐地点;

2 代表小华或小明(确保有2个);

0 代表可以通行的位置;

1 代表不可以出行的位置。

此时2者都能达到的聚餐位置有两处

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

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

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

在这里插入图片描述

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

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

相关文章

美联储的秘密议程 Fed's Hidden Agenda

编译 | 刘教链 教链按&#xff1a;本文是来自“米塞斯学院”Ryan McMaken的稿子&#xff0c;原标题是「美联储“软着陆”叙事背后的真实故事&#xff08;The Real Story Behind the Fed’s “Soft Landing” Narrative&#xff09;」。昨{2024.6.17内参&#xff1a;战报会骗人&…

实验1_配置标准IPv4 ACL

1、实验目的 通过本实验可以掌握&#xff1a; IPv4 ACL工作方式和工作过程定义编号和命名的标准IPv4 ACL的方法接口和VTY下应用标准IPv4 ACL的方法 2、实验拓扑 配置IPv4 ACL的实验拓扑如图9-2所示 配置 ACL 实验拓扑如下图所示。本实验中&#xff0c;通过配置标准 ACL 实现…

无痛接入图像生成风格迁移能力:GAN生成对抗网络

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

QT基础 - 布局管理器间隔控件

目录 一. QVBoxLayout 二. QHBoxLayout 三. QGridLayout 四. QFormLayout 五. Spacers 六.总结 一. QVBoxLayout QVBoxLayout 主要用于将控件在垂直方向上进行排列。 它具有以下特点&#xff1a; 可以方便地管理和组织控件&#xff0c;使其按照垂直顺序依次排列。能够自动…

视频批量剪辑利器:轻松掌握尺寸修改技巧,支持自定义及预设尺寸,提升剪辑效率!

在数字化时代&#xff0c;视频已经成为我们生活中不可或缺的一部分。无论是社交媒体上的短视频&#xff0c;还是公司宣传的长视频&#xff0c;都离不开精心剪辑与处理。然而&#xff0c;对于很多小伙伴来说&#xff0c;视频剪辑仍然是一项既耗时又耗力的任务。尤其是当需要处理…

算法训练营第六十天(延长12天添加图论) | LeetCode 647 回文子串、LeetCode 516 最长回文子序列

LeetCode 67 回文子串 思路很简单&#xff0c;每一个dp[i]等于dp[i-1]加上当前字符向前直到0各个长度字符串回文串个数即可 代码如下&#xff1a; class Solution {public boolean isValid(String s) {int l 0, r s.length() - 1;while (l < r) {if (s.charAt(l) ! s.ch…

钡铼技术BL104在环境监测站多协议采集保障数据全面准确

随着工业化和城市化进程的加快&#xff0c;环境污染问题日益严重&#xff0c;环境监测站在保护生态环境、保障公众健康中的作用变得越来越重要。钡铼技术PLC物联网关BL104&#xff0c;为环境监测站提供了一种高效、可靠的多协议数据采集解决方案&#xff0c;保障了监测数据的全…

Multisim软件仿真之频谱分析仪

网络上有很多Multisim文件&#xff0c;有些是不能复现的&#xff0c;比如频谱仪&#xff0c;按照下面链接去操作&#xff0c;怎么也测试不出来波形&#xff0c;multisim频谱仪使用_multisim输入输出端口-CSDN博客。 原因分析&#xff1a; 1、博主设置参数未讲全&#xff0c;按…

sprintboot依赖管理和自动配置

springboot依赖管理和自动配置 依赖管理和自动配置依赖管理什么是依赖管理修改自动仲裁/默认版本号 starter场景启动器starter场景启动器基本介绍官方提供的starter第三方starter 自动配置自动配置基本介绍SpringBoot自动配置了哪些?如何修改默认配置如何修改默认扫描包结构re…

APP渗透、WIFI近源渗透之透明代理下的流量分析与嗅探

APP渗透、WIFI近源渗透之透明代理下的流量分析与嗅探 原文链接&#xff1a;https://xz.aliyun.com/t/14864 前言 在攻防中对APP进行渗透时可能会遇到代理及VPN的检测&#xff0c;以及在近源渗透时可能会有WIFI钓鱼的需求&#xff0c;而透明代理是一个很好的解决方案&#xf…

完整迁移方案+工具:Citrix替换,无感迁移!

随着用户的替换进程进入到演进的阶段&#xff0c;用户面临的重大挑战包括&#xff1a; &#xff08;1&#xff09;大量数据的迁移需要精确规划&#xff0c;以避免数据丢失或损坏&#xff1b; &#xff08;2&#xff09;迁移效率低下&#xff0c;不仅会增加迁移成本&#xff0c;…

深度解读等保2.0标准

在数字经济时代&#xff0c;信息安全已成为一个不容忽视的问题&#xff0c;其中&#xff0c;等级保护机制也是一个不断演化的过程。近几年&#xff0c;国内发生了一次重要的变化&#xff0c;就是等保2.0标准的颁布和执行。文章对该协议2.0进行了详细的阐述&#xff0c;并对其在…

波兰媒体海外宣发:波兰媒体投放助力企业在波兰力挽狂澜-大舍传媒

引言 在全球化的背景下&#xff0c;企业对海外市场的开拓变得愈发重要。波兰作为中东欧地区的重要经济体之一&#xff0c;吸引了越来越多的企业眼球。在这一过程中&#xff0c;波兰媒体的海外宣发起到了关键作用。本文将重点探讨大舍传媒、比得哥什日报和瓦维尔快讯这三家波兰…

记一次 .NET某机械臂上位系统 卡死分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友找到我&#xff0c;说他们的程序会偶发性的卡死一段时间&#xff0c;然后又好了&#xff0c;让我帮忙看下怎么回事&#xff1f;窗体类的程序解决起来相对来说比较简单&#xff0c;让朋友用procdump自动抓一个卡死时的dump&#x…

macOS vscode常用快捷键

1、shiftoption上下箭头 复制当前行 2、commandd 选定多个相同的单词 先双击选定一个单词&#xff0c;然后按下commandd 依次选中要修改的单词&#xff0c;直接修改即可 3、全局替换某个单词 comandh 4、快速定位到某一行 controlg 5、选中某个区域 shiftoption&#xff0c;然…

医学人工智能在“免疫组化”领域的最新研究进展|顶刊速递·24-06-19

小罗碎碎念 顶刊速递&#xff5c;AI免疫组化 今天分享的文献主题是——人工智能与免疫组化的结合。其实之前的推文中也偶尔会提到免疫组化相关的内容&#xff0c;但是一直没有出一期&#xff0c;系统的梳理一下这一部分内容在医学AI中的应用&#xff0c;所以这期推文便来完成…

LabVIEW在中国航天中的应用

​LabVIEW是一种系统设计平台及开发环境&#xff0c;由美国国家仪器公司&#xff08;NI&#xff09;开发。它在中国航天领域的应用非常广泛&#xff0c;涵盖了测试与测量、数据采集、控制系统设计等多个方面。以下是LabVIEW在中国航天中的几个主要应用实例&#xff1a; 1. 测试…

微信小程序笔记 二!

小程序的宿主环境 - 宿主环境简介 1. 什么是宿主环境 宿主环境&#xff08;host environment&#xff09;指的是程序运行所必须的依赖环境。例如&#xff1a; Android 系统和 iOS 系统是两个不同的宿主环境。安卓版的微信 App 是不能在 iOS 环境下运行的&#xff0c;所以&…

shell脚本 函数

函数 shell的函数 定义&#xff1a;将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式。 for i in {} do 命令序列 done if [ ] then 命令序列 fi 作用&#xff1a;方便重复使用。函数库&#xff0c;集中在一起&#xff0c;随时可以传参调用。大的工…

数据资产安全保卫战:构建多层次、全方位的数据安全防护体系,守护企业核心数据资产安全

一、引言 在信息化时代&#xff0c;数据资产已成为企业运营的核心&#xff0c;其安全性直接关系到企业的生存与发展。然而&#xff0c;随着网络技术的飞速发展&#xff0c;数据泄露、黑客攻击等安全威胁日益增多&#xff0c;给企业的数据资产安全带来了严峻挑战。因此&#xf…