华为OD机试 - 智能驾驶 - 广度优先搜索(Java 2024 C卷 200分)

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

有一辆汽车需要从 m * n 的地图的左上角(起点)开往地图的右下角(终点 ),去往每一个地区都需要消耗一定的油量,加油站可进行加油

请你计算汽车确保从起点到达终点时所需的最少初始油量

说明:

(1)智能汽车可以上下左右四个方向移动;

(2)地图上的数字取值是 0 或 −1 或者正整数;

−1:表示加油站,可以加满油,汽车的油箱容量最大为 100;

0 :表示这个地区是障碍物,汽车不能通过;

正整数:表示汽车走过这个地区的耗油量

(3)如果汽车无论如何都无法到达终点,则返回 −1

二、输入描述

第一行为两个数字,M , N,表示地图的大小为 M * N ( 0 < M,N ≤ 200 )

后面一个M * N 的矩阵,其中的值是 0 或 −1 或正整数,加油站的总数不超过 200个

三、输出描述

如果汽车无论如何都无法到达终点,则返回-1

如果汽车可以到达终点,则返回最少的初始油量

1、输入

2 2
10 20
30 40

2、输出

70

3、说明

行走的路线为:右 -> 下

四、解题思路

这个问题可以被视为一个图搜索问题,我们需要找到从起点到终点的最佳路径,使得汽车在任意时刻都不耗尽油量。更具体地说,我们希望找到一个路径,使得从起点到终点所需的初始油量最少。

解题思路:

  1. 状态表示与搜索:使用广度优先搜索(BFS)来遍历地图。每个状态由 (x, y, fuel) 表示,其中 x 和 y 是汽车的当前位置,fuel 是当前的剩余油量。
  2. 维护剩余油量:在搜索过程中,我们需要维护从起点到当前位置所需要的最少初始油量。我们可以使用一个 minFuel[x][y] 数组来记录到达 (x, y) 所需的最小初始油量。
  3. 加油站处理:当汽车到达一个加油站(地图值为 -1),油量将被充满至 100。
  4. 油量计算:当从一个点移动到另一个点时,需要根据地图上的数值来增减油量。
  5. 边界与障碍物处理:如果遇到障碍物(地图值为 0),该方向将不被考虑。同时需要确保汽车在任何时刻的油量都不为负。

五、广度优先搜索

广度优先搜索(Breadth-First Search,简称 BFS)是一种用于遍历或搜索树或图的算法。这种算法从树的根(或图的某一顶点)开始,访问当前层的所有节点,然后前往下一层级。

BFS 的步骤:

  1. 将起始节点放入队列中。
  2. 从队列中取出一个节点,并检查它:
    • 如果它是目标节点,搜索结束。
    • 否则,将它所有尚未检查过的相邻节点加入队列中。
  3. 重复步骤2,直到队列为空或找到目标节点。
  4. 如果队列为空且未找到目标节点,则目标节点不在图中。

六、Java算法源码

public class Test06 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int M = scanner.nextInt(); // 读取地图的行数int N = scanner.nextInt(); // 读取地图的列数int[][] grid = new int[M][N];for (int i = 0; i < M; i++) {for (int j = 0; j < N; j++) {grid[i][j] = scanner.nextInt(); // 填充地图的每个格子}}System.out.println(minInitialFuel(M, N, grid)); // 计算并输出最少的初始油量}// 函数用于计算从地图的左上角到右下角所需的最少初始油量public static int minInitialFuel(int M, int N, int[][] grid) {// 如果起点或终点是障碍物,直接返回-1if (grid[0][0] == 0 || grid[M-1][N-1] == 0) {return -1;}// 创建一个数组用来存储到达每个点的最小初始油量int[][] minFuel = new int[M][N];for (int[] row : minFuel) {Arrays.fill(row, Integer.MAX_VALUE); // 初始化为极大值}// 起点的最小初始油量,如果起点是加油站,则为0,否则为格子上的数值minFuel[0][0] = grid[0][0] > 0 ? grid[0][0] : 0;// 方向数组,表示上下左右四个移动方向int[] dx = {0, 1, 0, -1};int[] dy = {1, 0, -1, 0};// 使用优先队列按照已消耗的油量排序,确保总是先处理需要油量最少的路径PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[2]));pq.offer(new int[] {0, 0, minFuel[0][0]}); // 起始位置入队// 广度优先搜索while (!pq.isEmpty()) {int[] current = pq.poll(); // 取出队列中油耗最少的状态int x = current[0];int y = current[1];int fuelUsed = current[2];// 到达终点,返回所需的最小初始油量if (x == M - 1 && y == N - 1) {return fuelUsed;}// 探索四个可能的移动方向for (int i = 0; i < 4; i++) {int nx = x + dx[i]; // 新的行坐标int ny = y + dy[i]; // 新的列坐标// 确保新坐标在地图范围内,并且不是障碍物if (nx >= 0 && nx < M && ny >= 0 && ny < N && grid[nx][ny] != 0) {// 计算到新位置的所需油量int requiredFuel = fuelUsed + (grid[nx][ny] > 0 ? grid[nx][ny] : 0);// 如果到达加油站,则可以将油量补满至100或保持原油量中的较小值if (grid[nx][ny] == -1) {requiredFuel = Math.min(fuelUsed, 100);}// 如果找到更少油耗的路径到达(nx, ny),则更新minFuel并将状态入队if (requiredFuel < minFuel[nx][ny]) {minFuel[nx][ny] = requiredFuel;pq.offer(new int[] {nx, ny, requiredFuel});}}}}// 如果所有可能的路径都被探索后仍无法到达终点,返回-1return -1;}
}

七、效果展示

1、输入

4 4
10 30 30 20
30 30 -1 10
0 20 20 40
10 -1 30 40

2、输出

70

3、说明

行走的路线为:右 -> 右 -> 下 -> 下 -> 下 -> 右


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

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

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

在这里插入图片描述

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

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

相关文章

Mybatis 缓存机制

序言 本文和大家聊聊 Mybatis 缓存。 一、本地缓存 Mybatis 内置了一个强大的事务性查询缓存机制&#xff0c;它可以非常方便地配置和定制。 默认情况下&#xff0c;只启用了本地的会话缓存&#xff08;又称一级缓存&#xff09;&#xff0c;它仅仅对一个会话中的数据进行缓…

上海亚商投顾:沪指缩量调整 有色、煤炭等周期股集体大跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日缩量调整&#xff0c;午后一度跌近1%&#xff0c;黄白二线走势分化&#xff0c;微盘股指数涨超3%。军…

单片机使用循环来实现延时和定时器延时的区别是什么?

循环延时是一种简单的实现方式&#xff0c;但由于资源占用和精确度的限制。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在…

Linux中的vi与vim:编辑器的王者之争与深度探索

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、vi与vim的历史与发展 …

(超级详细)JAVA之Stream流分析-------持续更新喔!!!

学习目标&#xff1a; 掌握 Java Stream流的相关api 掌握 Java Stream流的基本实现 掌握 java Stream流的使用场景 代码已经整理上传到了gitee中&#xff0c;有需要的小伙伴可以取查看一下源码点个小心心喔 大家也可以帮我提交一点案例喔&#xff01;&#xff01;&#xff01;&…

PostgreSQL 免费的对象-关系数据库

目录 一、什么是数据库 二、ORDBMS 的一些术语 三、PostgreSQL 概述 四、PostgreSQL数据库优点和缺点 4.1PostgreSQL数据库的优点 4.2PostgreSQL数据库的缺点 4.3PostgreSQL 特征 五、Linux 上安装 PostgreSQL 5.1Yum 安装 PostgreSQL 5.1.1安装postgreSQL的官方yum仓…

docker容器技术篇:容器集群管理实战mesos+zookeeper+marathon(一)

容器集群管理实战mesoszookeepermarathon&#xff08;一&#xff09; mesos概述 1.1 Mesos是什么 Apache Mesos 是一个基于多资源调度的集群管理软件&#xff0c;提供了有效的、跨分布式应用或框架的资源隔离和共享&#xff0c;可以运行 Hadoop、Spark以及docker等。 1.2 为…

maven多模块创建-安装配置

1、前提 许久没有写文章了&#xff0c;荒废了2年多的时间&#xff0c;在整理的时候&#xff0c;发现Maven还差一篇安装配置的文章&#xff0c;现在开始提笔完善它&#xff0c;参考&#xff1a;https://blog.csdn.net/m0_72803119/article/details/134634164。 —写于2024年4月…

在 Slurm 上运行 Jupyter

1. 背景介绍 现在的大模型训练越来越深入每个组了&#xff0c;大规模集群系统也应用的愈发广泛。一般的slurm系统提交作业分为2种&#xff0c;一种是srun&#xff0c;这种所见即所得的申请方式一般适用于短期的调试使用&#xff0c;大概一般允许的时间从几个小时到1天左右&…

自然语言处理: 第二十八章大模型基底之llama3

项目地址: meta-llama/llama3: The official Meta Llama 3 GitHub site 前言 LLaMa系列一直是人们关注的焦点&#xff0c;Meta在4月18日发布了其最新大型语言模型 LLaMA 3。该模型将被集成到其虚拟助手Meta AI中。Meta自称8B和70B的LLaMA 3是当今 8B 和 70B 参数规模的最佳模…

Elasticsearch集群部署(Linux)

1. 准备环境 这里准备三台Linux虚拟机&#xff0c;用于配置Elasticsearch集群和部署可视化工具Kibana。 角色IP域名集群名称节点名称版本操作系统ES192.168.243.100linux100cluster-eses-node-1007.12.0CentOS 7192.168.243.101linux101cluster-eses-node-101192.168.243.102…

ISP比普通的静态代理相比有什么优势?

ISP&#xff08;Internet Service Provider&#xff09;&#xff0c;即互联网服务提供商&#xff0c;是向广大用户综合提供互联网接入业务、信息业务、增值业务的电信运营商。而静态代理则是一个固定不变的代理IP地址&#xff0c;具有稳定性强、兼容性好和管理方便等特点。当我…

分布式与一致性协议之拜占庭将军问题(三)

拜占庭将军问题 叛将先发送消息 如果是叛将楚先发送作战消息&#xff0c;干扰作战计划&#xff0c;结果会有所不同吗&#xff1f; 在第一轮作战信息协商中&#xff0c;楚向苏秦发送作战指令"进攻",向齐、燕发送作战指令"撤退"&#xff0c;如图所示(当然还…

基于Python+Selenium+Pytest的Dockerfile如何写

使用 Dockerfile 部署 Python 应用程序与 Selenium 测试 在本文中&#xff0c;我们将介绍如何使用 Dockerfile 部署一个 Python 应用程序&#xff0c;同时利用 Selenium 进行自动化测试。我们将使用官方的 Python 运行时作为父镜像&#xff0c;并在其中安装所需的依赖项和工具…

【白菜学习问问问系列】if __name__ == ‘__main__‘:怎么理解

可以让.py文件既可以当成一个模块调用&#xff0c;也可以单独的作为一个函数执行

用html画一个四叶草

<!DOCTYPE html> <html lang"en" > <head> <meta charset"UTF-8"> <title>四叶草</title> <link href"" rel"stylesheet"> <link rel"stylesheet" href"css/style.css&q…

经典的目标检测算法有哪些?

一、经典的目标检测算法有哪些&#xff1f; 目标检测算法根据其处理流程可以分为两大类&#xff1a;One-Stage&#xff08;单阶段&#xff09;算法和Two-Stage&#xff08;两阶段&#xff09;算法。以下是一些经典的目标检测算法&#xff1a; 单阶段算法: YOLO (You Only Loo…

vue项目使用百度地图

打开百度地图开放平台 百度地图开放平台 | 百度地图API SDK | 地图开发 在控制台新建应用 复制访问应用的ak 可修改地图样式 使用部分 <!-- 引入地图 --><div class"main-aside"><div id"b-map-container"></div></div> …

Stable Diffusion WebUI 使用 LoRA 调整风格——详细教程

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本教程旨在深入探讨 LoRA 模型的奥秘&#xff0c;涵盖其基本概念、独特作用以及实操指南。我们将从下载和使用LoRA的步…

详解数据结构:队列(含栈与队列扩展)

一、顺序队列 有一种线性序列&#xff0c;特点是先进先出&#xff0c;这种存储结构称为队列。队列也是一种线性表&#xff0c;只不过它是操作受限的线性表&#xff0c;只能再两端操作&#xff1a;一端进、一端出。进的一端称为队尾&#xff0c;出的一端称为队头。队列可以用顺…