华为OD机试真题---智能驾驶

华为OD机试中的“智能驾驶”题目是一道涉及广度优先搜索(BFS)算法运用的题目。以下是对该题目的详细解析:

一、题目描述

有一辆汽车需要从m * n的地图的左上角(起点)开往地图的右下角(终点),去往每一个地区都需要消耗一定的油量,加油站可进行加油。请你计算汽车确保从起点到达终点时所需的最少初始油量。

二、地图说明

  • 智能汽车可以上下左右四个方向移动。

  • 地图上的数字取值是0、-1或正整数:

    • -1:表示加油站,可以加满油,汽车的油箱容量最大为100。
    • 0:表示这个地区是障碍物,汽车不能通过。
    • 正整数:表示汽车走过这个地区的耗油量。
  • 如果汽车无论如何都无法到达终点,则返回-1。

三、输入描述

第一行为两个数字M、N,表示地图的大小为M * N(0 < M, N ≤ 200)。后面一个M * N的矩阵,其中的值是0、-1或正整数,加油站的总数不超过200个。

四、输出描述

如果汽车无论如何都无法到达终点,则返回-1;如果汽车可以到达终点,则返回最少的初始油量。

五、解题思路

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

六、具体实现

可以使用队列来实现BFS算法,每次从队列中取出一个节点,并检查它的相邻节点。如果相邻节点是目标节点,则搜索结束;否则,将相邻节点加入队列中。在搜索过程中,需要维护一个maxfuel数组来记录到达每个位置所需的最小初始油量。

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;class State {int x, y, fuel;State(int x, int y, int fuel) {this.x = x;this.y = y;this.fuel = fuel;}
}public class SmartDriving {private static final int MAX_FUEL = 100;private static final int[][] DIRECTIONS = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};/*** 计算到达目的地所需的最小初始燃料量** @param m 表示网格的行数* @param n 表示网格的列数* @param grid 表示网格,其中0表示障碍物,1表示可通过的路径* @return 返回到达目的地所需的最小初始燃料量,如果无法到达则返回-1*/public static int minInitialFuel(int m, int n, int[][] grid) {// 检查起点和终点是否为障碍物,如果是,则无法到达目的地if (grid[0][0] == 0 || grid[m-1][n-1] == 0) {return -1;}// 初始化二分查找的边界int left = 0, right = MAX_FUEL;// 初始化结果为-1,表示无法到达目的地int result = -1;// 使用二分查找确定最小初始燃料量while (left <= right) {// 计算中间值int mid = (left + right) / 2;// 检查当前燃料量是否可以到达目的地if (canReach(grid, m, n, mid)) {// 如果可以到达,更新结果并继续在左侧搜索更小的燃料量result = mid;right = mid - 1;} else {// 如果无法到达,说明燃料量不足,继续在右侧搜索left = mid + 1;}}// 返回最小初始燃料量return result;}/*** 判断是否能够到达目的地** @param grid 二维数组表示的地图,其中-1表示加油站,0表示障碍物,其他正数表示该地点的耗油量* @param m 地图的行数* @param n 地图的列数* @param initialFuel 初始油量* @return 如果能够到达地图的右下角(目的地),返回true;否则返回false*/private static boolean canReach(int[][] grid, int m, int n, int initialFuel) {// 使用队列来实现广度优先搜索Queue<State> queue = new LinkedList<>();// maxFuel数组用于记录到达每个位置时的最大油量int[][] maxFuel = new int[m][n];// 初始化maxFuel数组,所有值设为-1,表示尚未到达for (int[] row : maxFuel) {java.util.Arrays.fill(row, -1);}// 计算初始油量,减去起点的耗油量int startFuel = initialFuel - grid[0][0];// 如果初始油量小于0,则无法开始旅程,返回falseif (startFuel < 0) {return false;}// 如果起点是加油站,初始油量设为最大值if (grid[0][0] == -1) {startFuel = MAX_FUEL;}// 将起点加入队列,并更新到达起点时的最大油量queue.offer(new State(0, 0, startFuel));maxFuel[0][0] = startFuel;// 使用广度优先搜索遍历地图while (!queue.isEmpty()) {// 取出队列头部的状态State state = queue.poll();int x = state.x, y = state.y, fuel = state.fuel;// 如果到达目的地,返回trueif (x == m - 1 && y == n - 1) {return true;}// 遍历四个可能的移动方向for (int[] dir : DIRECTIONS) {int nx = x + dir[0], ny = y + dir[1];// 检查新位置是否有效且不是障碍物if (0 <= nx && nx < m && 0 <= ny && ny < n && grid[nx][ny] != 0) {int newFuel = fuel;// 如果新位置是耗油区域,减少油量if (grid[nx][ny] > 0) {newFuel -= grid[nx][ny];}// 如果新位置是加油站,油量设为最大值if (grid[nx][ny] == -1) {newFuel = MAX_FUEL;}// 如果油量小于0,无法到达新位置,跳过if (newFuel < 0) {continue;}// 如果到达新位置的油量大于之前记录的最大油量,更新最大油量并加入队列if (newFuel > maxFuel[nx][ny]) {maxFuel[nx][ny] = newFuel;queue.offer(new State(nx, ny, newFuel));}}}}// 如果无法到达目的地,返回falsereturn false;}/*** 主函数,用于读取输入并计算最小初始燃料量*/public static void main(String[] args) {// 创建Scanner对象以读取输入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();}}// 调用minInitialFuel方法计算最小初始燃料量,并打印结果int result = minInitialFuel(m, n, grid);System.out.println(result);// 关闭Scanner对象scanner.close();}
}

七、测试用例

  1. 测试用例1

输入

2 2
10 20
30 40

输出

70

说明:行走的路线为右->下。

  1. 测试用例2
输入
3 3
0 10 10
10 10 10
10 10 10

输出

-1

说明:起点是障碍物,无法出发。

  1. 测试用例3
输入
4 4
10 30 30 20
30 30 -1 10
0 20 20 40
10 -1 30 40
输出
70

说明:行走的路线为右->右->下->下->下->右。

通过这些测试用例,可以验证算法的正确性和有效性。

在您提供的Java程序中,我们实现了一个智能驾驶系统,该系统能够计算到达地图右下角(目的地)所需的最小初始燃料量。地图由二维数组grid表示,其中每个元素的值代表该位置的耗油量(正数)或是否为加油站(-1表示加油站,不耗油且能将油量补满;0表示障碍物,无法通过)。

八、示例进行解析

输入示例
2 2
10 20
30 40
  • 2 2 表示地图是2行2列的。
  • 接下来的两行数字表示地图的具体内容:
    10 20
    30 40
    
    • 起点在(0, 0),耗油量为10
    • 终点在(1, 1),耗油量为40
    • 从起点到终点只有一条路径,即(0, 0) -> (1, 1)
输出示例
70
解析
  1. 起点油量计算

    • 初始燃料量设为X(我们要找的最小值)。
    • 起点耗油10,因此实际可用燃料为X - 10
  2. 路径耗油

    • (0, 0)(1, 1),需要耗油40(因为终点耗油量为40)。
  3. 燃料量计算

    • 为了让车辆能够到达终点,我们需要满足以下条件:
      • X - 10 >= 40(即初始燃料量减去起点耗油后,仍需足够到达终点的燃料)。
    • 解这个不等式,我们得到X >= 50。但是,由于路径上没有任何加油站,我们需要确保初始燃料量足够覆盖整个路径,并且考虑到起点和终点都是耗油位置,我们需要额外的燃料来确保在到达终点时不会因为油量不足而停下。
    • 实际上,由于只有一条路径且没有加油站,我们需要计算从起点到终点的总耗油量,并加上一定的安全余量(在这个例子中,由于只有一步,所以安全余量就是终点的耗油量)。但是,由于我们的二分查找策略是从0MAX_FUEL(100)进行的,它会自动找到满足条件的最小值。
  4. 二分查找

    • 程序通过二分查找来确定最小初始燃料量。在查找过程中,它会尝试不同的初始燃料量,并使用广度优先搜索(BFS)来检查是否能够到达终点。
    • 在这个例子中,二分查找会发现70是满足条件的最小值,因为:
      • 初始燃料量为70时,起点实际可用燃料为6070 - 10)。
      • 从起点到终点耗油40,剩余20,足够到达终点(尽管实际上在这个简单例子中我们不需要这额外的20燃料,但二分查找策略会确保找到一个安全的最小值)。

九、结论

输出70是正确的,因为它代表了能够确保车辆从起点安全到达终点所需的最小初始燃料量。在这个特定的例子中,由于路径上没有任何加油站,且起点和终点都是耗油位置,因此我们需要确保初始燃料量足够大,以覆盖整个路径并有一定的安全余量。二分查找和广度优先搜索的结合使用有效地找到了这个最小值。

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

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

相关文章

Redis与MySQL如何保证数据一致性

Redis与MySQL如何保证数据一致性 简单来说 该场景主要发生在读写并发进行时&#xff0c;才会发生数据不一致。 主要流程就是要么先操作缓存&#xff0c;要么先操作Redis&#xff0c;操作也分修改和删除。 一般修改要执行一系列业务代码&#xff0c;所以一般直接删除成本较低…

Linux宝塔部署wordpress网站更换服务器IP后无法访问管理后台和打开网站页面显示错乱

一、背景&#xff1a; wordpress网站搬家&#xff0c;更换服务器IP后&#xff0c;如果没有域名时&#xff0c;使用服务器IP地址无法访问管理后台和打开网站页面显示错乱。 二、解决方法如下&#xff1a; 1.wordpress搬家后&#xff0c;在新服务器上&#xff0c;新建站点时&am…

探秘嵌入式位运算:基础与高级技巧

目录 一、位运算基础知识 1.1. 位运算符 1.1.1. 与运算&#xff08;&&#xff09; 1.1.2. 或运算&#xff08;|&#xff09; 1.1.3. 异或运算&#xff08;^&#xff09; 1.1.4. 取反运算&#xff08;~&#xff09; 1.1.5. 双重按位取反运算符&#xff08;~~&#xf…

MySQL底层概述—3.InnoDB线程模型

大纲 1.InnoDB的线程模型 2.IO Thread 3.Purge Thread 4.Page Cleaner Thread 5.Master Thread 1.InnoDB的线程模型 InnoDB存储引擎是多线程的模型&#xff0c;因此其后台有多个不同的后台线程&#xff0c;负责处理不同的任务。 后台线程的作用一&#xff1a;负责刷新内存…

充满智慧的埃塞俄比亚狼

非洲的青山 随着地球温度上升&#xff0c;贝尔山顶峰的冰川消失殆尽&#xff0c;许多野生动物移居到海拔3000米以上的高原上生活&#xff0c;其中就包括埃塞俄比亚狼。埃塞俄比亚狼是埃塞俄比亚特有的动物&#xff0c;总数不到500只&#xff0c;为“濒危”物种。 埃塞俄比亚狼…

pikachu平台xss漏洞详解

声明&#xff1a;文章只是起演示作用&#xff0c;所有涉及的网站和内容&#xff0c;仅供大家学习交流&#xff0c;如有任何违法行为&#xff0c;均和本人无关&#xff0c;切勿触碰法律底线 文章目录 概述&#xff1a;什么是xss一、反射型XSS1. get2. post 二、存储型XSS三、DOM…

Easyexcel(7-自定义样式)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09;Easyexcel&#xff08;5-自定义列宽&#xff09;Easyexcel&#xff08;6-单…

FFN层,全称为Feed-Forward Network层;Layer Normalization;Softmax;

目录 FFN层,全称为Feed-Forward Network层 Layer Normalization 操作步骤 归一化和Softmax 归一化解决量纲问题 归一化(Normalization) Softmax FFN层,全称为Feed-Forward Network层 是Transformer架构中的一个关键组件。它本质上是一个简单的多层感知机(MLP),用…

Android OTA 更新面试题及参考答案

目录 什么是 OTA 更新? 什么是 OTA 更新的主要目的? Android OTA 更新是如何与系统的分区机制相互配合的? 什么是 A/B 分区更新,它的优势是什么? Android 系统中的 “System Partition” 和 “Vendor Partition” 有什么区别? 请详细阐述 Android OTA 更新的基本原…

网络研讨会——如何使用Figma、Canva或Sketch设计Delphi移动应用程序

2024年11月30日星期六 - 北京午夜12点 如何使用Figma、Canva或Sketch设计Delphi移动应用程序 专业设计应用程序Figma、Sketch和Canva有大量优秀的应用程序设计等着你去实现。我们看看有什么可用的&#xff0c;并使用一些最好的设计来创建应用程序。。。 立即报名免费在线研讨会…

通用网络安全设备之【防火墙】

概念&#xff1a; 防火墙&#xff08;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;它是一种位于内部网络与外部网络之间的网络安全防护系统&#xff0c;是一种隔离技术&#xff0c;允许或是限制传输的数据通过。 基于 TCP/IP 协议&#xff0c;主要分为主机型防火…

对于GC方面,在使用Elasticsearch时要注意什么?

大家好&#xff0c;我是锋哥。今天分享关于【对于GC方面&#xff0c;在使用Elasticsearch时要注意什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; 对于GC方面&#xff0c;在使用Elasticsearch时要注意什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java…

[仓颉Cangjie刷题模板] 优先队列(含小顶堆实现)

[TOC]([仓颉Cangjie刷题模板] 优先队列(含小顶堆实现) ) 一、 算法&数据结构 1. 描述 堆是一个可以维护实时最大/最小值的数据结构&#xff0c;相比treeset等常数优很多。 常用于维护一组数据的极值贪心问题。2. 复杂度分析 初始化O(n)查询O(1)修改O(lgn) 3. 常见应用…

解决 MySQL 5.7 安装中的常见问题及解决方案

目录 前言1. 安装MySQL 5.7时的常见错误分析1.1 错误原因及表现1.2 错误的根源 2. 解决方案2.1 修改YUM仓库配置2.2 重新尝试安装2.3 处理GPG密钥错误2.4 解决依赖包问题 3. 安装成功后的配置3.1 启动MySQL服务3.2 获取临时密码3.3 修改root密码 4. 结语 前言 在Linux服务器上…

计算机网络 网络安全基础——针对实习面试

目录 网络安全基础你了解被动攻击吗&#xff1f;你了解主动攻击吗&#xff1f;你了解病毒吗&#xff1f;说说基本的防护措施和安全策略&#xff1f; 网络安全基础 网络安全威胁是指任何可能对网络系统造成损害的行为或事件。这些威胁可以是被动的&#xff0c;也可以是主动的。…

oracle小技巧-解决特殊密码字符而导致的exp错误

在使用oracle数据库的时候&#xff0c;我们经常会利用exp工具对某些表进行导出。但有些时候&#xff0c;因我们用户密码为安全性设有特殊字符&#xff0c;导致exp导出时候报&#xff1a;“EXP-00056和ORA-12154”&#xff0c;今天我们就分享下如何通过设置符号隔离的小技巧解决…

【在 PyTorch 中使用 tqdm 显示训练进度条,并解决常见错误TypeError: ‘module‘ object is not callable】

在 PyTorch 中使用 tqdm 显示训练进度条&#xff0c;并解决常见错误TypeError: module object is not callable 在进行深度学习模型训练时&#xff0c;尤其是在处理大规模数据时&#xff0c;实时了解训练过程中的进展是非常重要的。为了实现这一点&#xff0c;我们可以使用 tq…

Taro 鸿蒙技术内幕系列(三) - 多语言场景下的通用事件系统设计

基于 Taro 打造的京东鸿蒙 APP 已跟随鸿蒙 Next 系统公测&#xff0c;本系列文章将深入解析 Taro 如何实现使用 React 开发高性能鸿蒙应用的技术内幕 背景 在鸿蒙生态系统中&#xff0c;虽然原生应用通常基于 ArkTS 实现&#xff0c;但在实际研发过程中发现&#xff0c;使用 C…

【计算机网络】C/C++实现解析Wireshark离线数据包,附源码

直接先上demo 以下是一个完整的示例代码&#xff0c;演示如何使用 pcap_open_offline 函数打开一个捕获文件并读取数据包。 #include <stdio.h> #include <pcap.h>int main(int argc, char **argv) {if (argc ! 2) {fprintf(stderr, "Usage: %s <capture…

PostgreSQL外键全解析:从概念到实践的进阶指南

全文目录&#xff1a; 开篇语目录前言&#xff1a;关于外键你真的懂了吗&#xff1f;&#x1f914;外键的定义和作用 &#x1f4da;如何在PostgreSQL中创建外键 &#x1f331;基本语法示例&#xff1a;建立简单的外键关系 外键约束的各种行为和选项 &#x1f9e9;ON DELETE 与 …