华为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://www.hqwc.cn/news/643823.html

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

相关文章

spring的跨域问题

跨域问题 什么是跨域解决跨域 什么是跨域 跨域问题本质是浏览器的一种保护机制&#xff0c;它的初衷是为了保证用户的安全&#xff0c;防止恶意网站窃取数据。如果出现了以下情况中的任意一种&#xff0c;那么它就是跨域请求&#xff1a; 1、协议不同&#xff0c;如 http 和 h…

软件测试之【软件测试概论二】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言软件测试模型瀑布模型V模型W&#xff08;双V&#xff09;模型测试活动 软…

AI视频下载:零基础2小时学会开发 Chrome扩展程序

无论您是有抱负的Web开发人员、AI爱好者还是生产力黑客&#xff0c;本课程都提供了宝贵的见解和实践经验&#xff0c;帮助您利用AI和Chrome扩展的力量来简化Web自动化&#xff0c;改善各个行业和领域的用户体验&#xff0c;解锁AI驱动生产力的潜力&#xff01; 此课程面向以下…

SpringBoot + kotlin 协程小记

前言&#xff1a; Kotlin 协程是基于 Coroutine 实现的&#xff0c;其设计目的是简化异步编程。协程提供了一种方式&#xff0c;可以在一个线程上写起来像是在多个线程中执行。 协程的基本概念&#xff1a; 协程是轻量级的&#xff0c;不会创建新的线程。 协程会挂起当前的协…

揭开ChatGPT面纱(2):OpenAI主类源码概览

文章目录 〇、使用OpenAI的两个步骤一、初始化方法__init__()1.源码2.参数解析 二、提供的接口1.源码2.接口说明主要接口说明 OpenAI版本1.6.1 〇、使用OpenAI的两个步骤 在上一篇博客中&#xff0c;我实现并运行了一个OpenAI的demo&#xff0c;我们可以发现&#xff0c;想要使…

WSL2无法ping通本地主机ip的解决办法

刚装完WSL2的Ubuntu子系统时&#xff0c;可能无法ping通本地主机的ip&#xff1a; WSL2系统ip&#xff1a; 本地主机ip&#xff1a; 在powershell里输入如下的命令&#xff1a; New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias &quo…

debian8安装后无法使用博通无线网卡BCM43224,提示缺少固件

装完debian8后发现主机自带的无线网卡不能使用,并且在安装系统过程中会有提示: 您的一些硬件需要非自由固件文件才能运转。固件可以从移动介质加载。 缺失的固件文件是:brcm/brcm43xx-0.fw我没有理会,装完后发现无线网卡不能用 需要安装 broadcom-wl 查看网卡芯片型号 …

C++中的list类模拟实现

目录 list类模拟实现 list类节点结构设计 list类非const迭代器结构设计 迭代器基本结构设计 迭代器构造函数 operator()函数 operator*()函数 operator!()函数 operator(int)函数 operator--()函数 operator--(int)函数 operator()函数 operator->()函数 list…

stm32知识记录

文章目录 单片机发送AT指令给ESP8266接收手机app数据的结构体C语言的枚举类枚举类的应用 设置水泵开启关闭代码分析DS18B20的端口项目接线问题ADC全部信道STM32F103C8T6引脚定义 单片机发送AT指令给ESP8266 以下是一个简单的示例&#xff0c;演示了如何使用AT指令从单片机发送…

【CouchDB 与 PouchDB】

CouchDB是什么 CouchDB&#xff0c;全名为Apache CouchDB&#xff0c;是一个开源的NoSQL数据库&#xff0c;由Apache软件基金会管理。CouchDB的主要特点是使用JSON作为存储格式&#xff0c;使用JavaScript作为查询语言&#xff08;通过MapReduce函数&#xff09;&#xff0c;并…

vuetify3.0+tailwindcss+vite最新框架

1、根据vuetify官网下载项目 安装vuetify项目 2、根据tailwindcss官网添加依赖 添加tailwindcss依赖 3、 配置main.ts // main.ts import "./style.css"4、使用 <template><h1 class"text-3xl font-bold underline">Hello world!</…

MySQL无法打开情况下读取frm文件的表结构

一、背景&#xff1a; 开发人员通过MySQL客户端工具&#xff0c;可以访问MySQL5.7.6&#xff0c;可以访问具体的DB&#xff0c;可以查看小写表的数据&#xff0c;但是无法查看大写表的数据&#xff0c;报错信息为“table does not exist”。 二、检查与分析&#xff1a; ssh登录…