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

news2024/12/27 10:26:41

在这里插入图片描述

华为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) {
        // 如果起点或终点是障碍物,直接返回-1
        if (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});
                    }
                }
            }
        }

        // 如果所有可能的路径都被探索后仍无法到达终点,返回-1
        return -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.coloradmin.cn/o/1622071.html

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

相关文章

「 网络安全常用术语解读 」什么是0day、1day、nday漏洞

1. 引言 漏洞攻击的时间窗口被称为漏洞窗口&#xff08;window of vulnerability&#xff09;。一般来说&#xff0c;漏洞窗口持续的时间越长&#xff0c;攻击者可以利用漏洞进行攻击的可能性就越大。 2. 0day 漏洞 0day 漏洞&#xff0c;又被称为"零日漏洞"&…

YUNBEE云贝-Oracle 19c OCM 5月19日

Oracle 19c OCM认证大师培训 - 课程体系 - 云贝教育 (yunbee.net) 19c OCM考试类别&#xff1f; Oracle 19c OCM认证大师直考(2天考试&#xff0c;4个模块&#xff0c;每个模块3小时) Oracle 19c OCM认证大师升级考(1天考试&#xff0c;2个模块&#xff0c;每个模块3小时) 在…

Day1--什么是网络安全?网络安全常用术语

目录 1. 什么是网络安全&#xff1f; 信息系统&#xff08;Information System&#xff09; 信息系统安全三要素&#xff08;CIA&#xff09; 网络空间安全管理流程 网络安全管理 2. 网络安全的常用术语 3. 网络安全形势 4. 中国网络安全产业现状 1. 什么是网络安全&am…

pnpm install报错 Value of “this“ must be of type URLSearchParams

执行pnpm install的时候就报错Value of “this” must be of type URLSearchParams 由于之前执行没有出现过这个问题&#xff0c;最近在使用vue3所以使用了高版本的node&#xff0c;怀疑是node版本的问题。 解决&#xff1a; 检查node版本 node -v当前使用的是20.11.0的 修改…

婚恋app系统开发相亲交友小程序源码单身交友app软件下载客户管理系统婚恋交友平台管理系统源码h5聊天室源码

在数字化时代&#xff0c;婚恋相亲交友小程序以其便捷、高效、智能的特点&#xff0c;受到了越来越多人的青睐。红娘婚恋相亲交友系统源码&#xff0c;凭借其对微信小程序、微信公众号、H5以及APP的全方位支持&#xff0c;成为了婚恋市场的明星产品。 首先&#xff0c;婚恋相亲…

力扣HOT100 - 124. 二叉树中的最大路径和

解题思路&#xff1a; class Solution {int max Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {maxGain(root);return max;}public int maxGain(TreeNode node) {if (node null) return 0;int leftGain Math.max(maxGain(node.left), 0);int rightGain Math.ma…

go+react实现远程vCenter虚拟机管理终端

文章目录 React-VcenterDemoQuick Start React-Vcenter 基于go & react实现远程vSphere vcenter虚拟机终端console页面&#xff0c;提供与vcenter管理中的Launch Web Console相同的功能。 项目地址&#xff1a;react-vcenter Demo URL: http://localhost:3000 Quick St…

Unity 踩坑记录 Rigidbody 刚体重力失效

playerSetting > physics > Gravity > 设置 Y 的值为负数

《苍穹外卖》Day07部分知识点记录

一、菜品缓存 减少查询数据库的次数&#xff0c;优化性能 客户端&#xff1a; package com.sky.controller.user;import com.sky.constant.StatusConstant; import com.sky.entity.Dish; import com.sky.result.Result; import com.sky.service.DishService; import com.sky…

使用微软Phi-3-mini模型快速创建生成式AI应用

微软Phi-3大语言模型是微软研究院推出的新一代系列先进的小语言模型。Phi-3系列包括phi-3-mini、phi-3-small和phi-3-medium三个不同规模的版本。这些模型在保持较小的参数规模的同时&#xff0c;通过精心设计的训练数据集和优化的算法&#xff0c;实现了与大型模型相媲美的语言…

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

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言测试用例的前因后果测试用例的设计方法黑盒测试用例设计方法&#x1f525…

JavaEE 初阶篇-深入了解 I/O 流(FileInputStream 与 FileOutputStream 、Reader 与 Writer)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 I/O 流概述 2.0 文件字节输入流(FileInputStream) 2.1 创建 FileInputStream 对象 2.2 读取数据 2.3 关闭流 3.0 文件字节输出流(FileOutputStream) 3.1 创建 Fi…

html、css、QQ音乐移动端静态页面,资源免费分享,可作为参考,提供InsCode在线运行演示

CSDN将我上传的免费资源私自变成VIP专享资源&#xff0c;且作为作者的我不可修改为免费资源&#xff0c;不可删除&#xff0c;寻找客服无果&#xff0c;很愤怒&#xff0c;&#xff08;我发布免费资源就是希望大家能免费一起用、一起学习&#xff09;&#xff0c;接下来继续寻找…

智慧医院解决方案

5G智慧导航解决方案https://www.cgltzk.vip/doc/1537/ 深圳市妇幼保健院妇产科住院大楼智能化系统招标文件(技术规格书)https://www.cgltzk.vip/doc/1534/ 三甲医院智能化系统设计方案https://www.cgltzk.vip/doc/1423/ 医院智能化设计方案https://www.cgltzk.vip/doc/1422/ …

矩阵按列相乘运算的并行化实现方法

这两天一直在琢磨如下矩阵计算问题。 已知dm矩阵X和hq矩阵Y&#xff0c;求如下矩阵&#xff1a; 其中X(:,i), Y(:,j)分别表示矩阵X, Y的第i列和第j列&#xff0c;易知Z为dh矩阵。 如果直接串行计算矩阵Z&#xff0c;两个循环共有mq&#xff0c;则会很慢&#xff0c;能不能并行化…

UE5 GAS开发P34 游戏效果理论

GameplayEffects Attributes&#xff08;属性&#xff09;和Gameplay Tags&#xff08;游戏标签&#xff09;分别代表游戏中实体的特性和标识。 Attributes&#xff08;属性&#xff09;&#xff1a;Attributes是用来表示游戏中实体的特性或属性的值&#xff0c;例如生命值、…

Ant Design Vue + js 表格计算合计

1.需要计算的数量固定&#xff08;如表1&#xff0c;已知需要计算的金额为&#xff1a;装修履约保证金 装修垃圾清运费出入证工本费 出入证押金 这四项相加&#xff0c;可以写成固定的算法&#xff09;&#xff1a; 表格样式&#xff1a; <h4 style"margin: 0 0 8px…

【数据结构】图(Graph)

文章目录 概念图的存储方式邻接矩阵邻接矩阵表示法邻接矩阵表示法的特点 邻接表邻接表表示法邻接表表示法的特点邻接表表示法的定义与实现查找插入删除其它构造函数析构函数创建图输出图 图的遍历深度优先遍历&#xff08;DFS&#xff09;广度优先遍历 图的连接分量和生成树生成…

Xilinx 7系列MMCM/PLL的使用模型

本文展示了MMCM的一些使用模型&#xff08;同样适用于PLL&#xff09;&#xff0c;如时钟网络去偏斜、具有内部反馈的MMCM和零延迟缓冲区等。 1、时钟网络去偏斜&#xff08;Clock Network Deskew&#xff09; MMCM的主要用途之一是用于时钟网络去偏斜。图3-11和图3-12展示了…

【2024年最新】NodeMCU-ESP8266刷AT固件教程——适用于esp-12E和esp-12F

硬件图片 原理图 0、工具打包下载 工具包 密码:keduo 1、工具及固件下载 固件下载地址&#xff1a; 欢迎 | 安信可科技 (ai-thinker.com) 下载以下固件&#xff1a; 直接下载地址&#xff1a;AT 固件&#xff08;固件号&#xff1a;0781&#xff09; 下载以下工具&#xf…