华为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;负责刷新内存…

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-单…

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

概念&#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;今天我们就分享下如何通过设置符号隔离的小技巧解决…

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

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

带有悬浮窗功能的Android应用

android api29 gradle 8.9 要求 布局文件 (floating_window_layout.xml): 增加、删除、关闭按钮默认隐藏。使用“开始”按钮来控制这些按钮的显示和隐藏。 服务类 (FloatingWindowService.kt): 实现“开始”按钮的功能&#xff0c;点击时切换增加、删除、关闭按钮的可见性。处…

ML 系列:第 36 节 — 统计学中的抽样类型

ML 系列&#xff1a;第 36 天 — 统计学中的抽样类型 文章目录 一、说明二、抽样方法三、简单随机抽样四、 Stratified Sampling分层抽样五、 Cluster Sampling 整群抽样六、Systematic Sampling系统抽样七、Convenience Sampling便利抽样八、结论 一、说明 统计学中的抽样类型…

CGMA – Cloth Creation and Simulation for Real-Time

CGMA – 实时布料创建和模拟 Info&#xff1a; 本课程介绍如何将 Marvelous Designer 整合到布料工作流程中以实时创建角色&#xff0c;从软件基础知识到创建逼真和风格化服装的高级技术。本课程将首先介绍软件&#xff0c;通过创建现代、现代的服装&#xff0c;然后深入探讨使…

Springboot组合SpringSecurity安全插件基于密码的验证Demo

Springboot组合SpringSecurity安全插件基于密码的验证Demo!下面的案例&#xff0c;都是基于数据库mysql&#xff0c;用户密码&#xff0c;验证登录的策略demo。 1&#xff1b;引入maven仓库的坐标 <dependency><groupId>org.springframework.boot</groupId>…

从Full-Text Search全文检索到RAG检索增强

从Full-Text Search全文检索到RAG检索增强 时光飞逝&#xff0c;转眼间六年过去了&#xff0c;六年前铁蛋优化单表千万级数据查询性能的场景依然历历在目&#xff0c;铁蛋也从最开始做CRUD转行去了大数据平台开发&#xff0c;混迹包装开源的业务&#xff0c;机缘巧合下做了实时…

单片机学习笔记 8. 矩阵键盘按键检测

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘 目录 0、实现的…

【AI日记】24.11.26 聚焦 kaggle 比赛

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 1 内容&#xff1a;研究 kaggle 比赛时间&#xff1a;3 小时 核心工作 2 内容&#xff1a;学习 kaggle 比赛 Titanic - Machine Learning from Disaster时间&#xff1a;4 小时备注&#xff1a;这…