华为OD机试真题——智能驾驶(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

在这里插入图片描述

2025 A卷 200分 题型

本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》

华为OD机试真题《智能驾驶》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C

GO


题目名称:智能驾驶


  • 知识点:动态规划、贪心算法、图搜索(BFS/DFS)
  • 时间限制:1秒
  • 空间限制:256MB
  • 限定语言:不限

题目描述

一辆汽车需要从 ( m \times n ) 的地图左上角(起点)行驶到右下角(终点)。每个格子有以下属性:

  • -1:加油站,可加满油(油箱容量最大为100)。
  • 0:障碍物,无法通过。
  • 正整数:通过该格子需消耗的油量。

规则

  1. 汽车可上下左右移动。
  2. 初始油量需确保能到达终点,计算最少初始油量。若无法到达,返回-1。
  3. 油箱初始为空,若起点为加油站则初始油量为100。

输入

  • 首行两个整数 ( m ) 和 ( n ),表示地图行数和列数。
  • 接下来 ( m ) 行,每行 ( n ) 个整数,表示地图数据。

输出

  • 最少初始油量或-1。

示例
输入:

2 2  
10 20  
30 40  

输出:

70  

解释:路径为右→下,初始油量需 ≥ 10(起点) + 30(下一步) = 40,但实际需覆盖路径最大累计消耗(10+20+40=70)。


Java

问题分析

汽车需要从地图左上角移动到右下角,每个格子可能有不同的油量消耗或加油站。油箱容量最大为100,初始油量为空。若起点是加油站,初始油量为100。要求找到能到达终点的最小初始油量,若无法到达返回-1。

解题思路

  1. 动态规划与优先队列:使用Dijkstra算法,优先扩展当前最大油量消耗最小的路径。
  2. 状态定义:每个状态包括当前位置、当前区段累计油量、路径最大油量消耗。
  3. 加油站处理:到达加油站时,油量加满,当前区段累计油量重置为0。
  4. 障碍物处理:遇到障碍物直接跳过。

代码实现

import java.util.*;class State implements Comparable<State> {int i, j;int currentSegment;int maxSoFar;public State(int i, int j, int currentSegment, int maxSoFar) {this.i = i;this.j = j;this.currentSegment = currentSegment;this.maxSoFar = maxSoFar;}@Overridepublic int compareTo(State other) {return Integer.compare(this.maxSoFar, other.maxSoFar);}
}public class Main {private static String getKey(int i, int j, int segment) {return i + "," + j + "," + segment;}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();}}// 起点是障碍物if (grid[0][0] == 0) {System.out.println(-1);return;}PriorityQueue<State> pq = new PriorityQueue<>();Map<String, Integer> dist = new HashMap<>();// 初始化起点if (grid[0][0] == -1) {pq.offer(new State(0, 0, 0, 0));dist.put(getKey(0, 0, 0), 0);} else {int initialCost = grid[0][0];pq.offer(new State(0, 0, initialCost, initialCost));dist.put(getKey(0, 0, initialCost), initialCost);}int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};while (!pq.isEmpty()) {State state = pq.poll();int i = state.i;int j = state.j;int currentSegment = state.currentSegment;int maxSoFar = state.maxSoFar;// 到达终点if (i == m - 1 && j == n - 1) {System.out.println(maxSoFar);return;}String currentKey = getKey(i, j, currentSegment);if (dist.getOrDefault(currentKey, Integer.MAX_VALUE) < maxSoFar) {continue;}for (int[] dir : dirs) {int ni = i + dir[0];int nj = j + dir[1];if (ni < 0 || nj < 0 || ni >= m || nj >= n) continue;int cellValue = grid[ni][nj];if (cellValue == 0) continue;int cost = cellValue == -1 ? 0 : cellValue;int newSegment = currentSegment + cost;boolean isGasStation = cellValue == -1;int newMax = Math.max(maxSoFar, newSegment);// 处理加油站if (isGasStation) {if (newSegment > 100) continue;newSegment = 0; // 加满油,新区段从0开始} else {// 来自加油站或起点是加油站,新区段不能超过100if (currentSegment == 0 && newSegment > 100) {continue;}}int newSegmentAfter = isGasStation ? 0 : newSegment;State newState = new State(ni, nj, newSegmentAfter, newMax);String newKey = getKey(ni, nj, newSegmentAfter);if (!dist.containsKey(newKey) || newMax < dist.getOrDefault(newKey, Integer.MAX_VALUE)) {dist.put(newKey, newMax);pq.offer(newState);}}}System.out.println(-1);}
}

代码详解

  1. State类:存储当前位置、当前区段累计油量、路径最大油量消耗,并实现优先队列比较接口。
  2. 输入处理:读取地图数据,处理起点障碍物情况。
  3. 优先队列初始化:根据起点是否为加油站设置初始状态。
  4. 状态扩展:遍历四个方向,计算新位置的油量消耗,处理加油站逻辑,更新状态并加入优先队列。
  5. 终点检测:到达终点时输出结果。

示例测试

示例1输入

2 2
10 20
30 40

输出:70

示例2输入

3 3
-1 20 0
30 0 40
50 60 70

输出:100(路径包含加油站,最大区段消耗为30+50=80,但需加满油)

示例3输入

2 2
0 10
20 30

输出:-1(起点障碍物)

综合分析

  • 时间复杂度:使用优先队列处理状态,最坏情况O(N log N),适用于小规模地图。
  • 空间复杂度:存储状态信息,O(MNC),C为区段油量可能值。
  • 正确性:通过Dijkstra算法保证找到最优路径,处理加油站和障碍物逻辑。
  • 适用性:适用于各种地图配置,正确处理油量限制和加油站逻辑。

python

问题分析

汽车需要从地图左上角移动到右下角,每个格子可能有不同的油量消耗或加油站。油箱容量最大为100,初始油量为空。若起点是加油站,初始油量为100。要求找到能到达终点的最小初始油量,若无法到达返回-1。

解题思路

  1. 优先队列(Dijkstra算法):每次扩展当前最大油量消耗最小的路径。
  2. 状态定义:每个状态包括位置、当前区段累计油量、路径最大油量消耗。
  3. 加油站处理:到达加油站时,油量加满,当前区段累计油量重置为0。
  4. 障碍物处理:遇到障碍物直接跳过。

代码实现

import heapqdef min_initial_fuel(grid):m = len(grid)if m == 0:return -1n = len(grid[0])if grid[0][0] == 0:return -1  # 起点是障碍物start_val = grid[0][0]# 初始化起点状态if start_val == -1:initial_segment = 0initial_max = 0else:if start_val > 100:return -1  # 初始油量不足initial_segment = start_valinitial_max = start_valheap = []heapq.heappush(heap, (initial_max, 0, 0, initial_segment))visited = {}visited_key = (0, 0, initial_segment)visited[visited_key] = initial_maxdirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]while

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

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

相关文章

速卖通,国际站测评补单,如何平衡效率和安全

测评能够帮助卖家让平台更喜欢自己的产品&#xff0c;给予更好排名的同时也让后续进入店铺的买家更容易认可自己的产品。这是进行真实交易后形成的评价&#xff0c;而不是通过机器软件生成&#xff0c;形成虚拟数据后&#xff0c;那种刷评形式产生的评论。它符合任何电商平台的…

学习路之PHP--easyswoole3.3入门及文件热加载

学习路之PHP--easyswoole入门 一、框架说明二、常用命令三、文件热加载 一、框架说明 目录结构 目录结构 project 项目部署目录 ├─App 应用目录(可以有多个) │ ├─HttpController 控制器目录 │ │ └─Index.php …

设计模式26——解释器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 解释器模式&#xff08;Interp…

第三届宁波技能大赛网络安全赛项样题

2025 第三届宁波技能大赛网络安全赛项样题 模块A: 网络安全事件响应、数字取证调查和应用安全任务一:应急响应任务二:操作系统取证任务三:网络数据包分析任务四:代码审计 模块B:CTF 夺旗-攻击模块C:CTF 夺旗-防御需要环境培训可以私信博主&#xff01;&#xff01;&#xff01;…

GO语言进阶:掌握进程OS操作与高效编码数据转换

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…

IO进程(进程 Process)

什么是进程&#xff1f; 1.概念 程序&#xff1a;编译好的可执行文件&#xff0c;存放在磁盘上的指令和数据的有序集合。 由此可见程序是静态的&#xff0c;没有执行的概念。 进程&#xff1a;是程序的一次执行的过程&#xff0c;是一个可调度的任务&#xff0c;也是执行一…

CSS传统布局与定位详解与TDK三大标签SEO优化

一、传统布局基础 1. 文档流布局 浏览器默认的文档流布局方式遵循以下规则&#xff1a; 块级元素&#xff08;如<div>、<p>、<h1>&#xff09;&#xff1a; 独占一行宽度默认100%可以设置宽高、内外边距 div {width: 500px;height: 200px;margin: 10px …

【GraphQL】深入解析 Apollo Client:从架构到实践的一站式 GraphQL 解决方案

深入解析 Apollo Client&#xff1a;从架构到实践的一站式 GraphQL 解决方案 1. 引言 GraphQL 作为现代 API 开发的核心技术&#xff0c;其灵活性和高效性正在重塑数据交互模式。Apollo Client 作为 GraphQL 生态中最受欢迎的客户端库&#xff0c;凭借强大的缓存机制、框架集…

docker学习基本使用教程

docker是一款用于开发部署和运行容器化平台&#xff0c;能将应用及其依赖打包成轻量级、可移植的容器&#xff0c;实现一次构建&#xff0c;随处运行。docker是cs架构程序&#xff08;客户端和服务端&#xff09;&#xff0c;docker客户端向docker守护进程发送请求&#xff0c;…

万字详解RTR RTSP SDP RTCP

目录 1 RTSP1.1 RTSP基本简介1.2 RSTP架构1.3 重点内容分析 2 RTR2.1 RTR简介2.2 RTP 封装 H.2642.3 RTP 解封装 H.2642.4 RTP封装 AAC2.5 RTP解封装AAC 3 SDP3.1 基础概念3.2 SDP协议示例解析3.3 重点知识 4 RTCP4.1 RTCP基础概念4.2 重点 5 总结 1 RTSP 1.1 RTSP基本简介 一…

唯一原生适配鸿蒙电脑的远程控制应用,向日葵正式上线

近日&#xff0c;华为正式发布鸿蒙电脑新品&#xff0c;标志着HarmonyOS在PC端生态的进一步拓展。作为远程控制领域的先行者&#xff0c;贝锐科技旗下的向日葵远程控制软件也在第一时间完成了对鸿蒙电脑系统的原生适配&#xff0c;并已正式上线华为鸿蒙电脑应用市场&#xff0c…

vue2中,codemirror编辑器的使用

交互说明 在编辑器中输入{时&#xff0c;会自动弹出选项弹窗&#xff0c;然后可以选值插入。 代码 父组件 <variable-editorv-model"content":variables"variables"placeholder"请输入模板内容..."blur"handleBlur" />data…

Kafka自定义分区策略实战避坑指南

文章目录 概要代码示例小结 概要 kafka生产者发送消息默认根据总分区数和设置的key计算哈希取余数&#xff0c;key不变就默认存放在一个分区&#xff0c;没有key则随机数分区&#xff0c;明显默认的是最不好用的&#xff0c;那kafka也提供了一个轮询分区策略&#xff0c;我自己…

WPF 全屏显示实现(无标题栏按钮 + 自定义退出按钮)

WPF 全屏显示实现&#xff08;无标题栏按钮 自定义退出按钮&#xff09; 完整实现代码 MainWindow.xaml <Window x:Class"FullScreenApp.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas…

sqli_labs第二十九/三十/三十一关——hpp注入

一&#xff1a;HTTP参数污染&#xff1a; hpp&#xff08;http parameter pollution)注入中&#xff0c;可以通过在hppt的请求中注入多个同名参数来绕过安全过滤 原理&#xff1a;php默认只取最后一个同名参数 比如在这一关里&#xff0c;可能对第一个id参数进行消毒处理&a…

【STM32】按键控制LED 光敏传感器控制蜂鸣器

&#x1f50e;【博主简介】&#x1f50e; &#x1f3c5;CSDN博客专家 &#x1f3c5;2021年博客之星物联网与嵌入式开发TOP5 &#x1f3c5;2022年博客之星物联网与嵌入式开发TOP4 &#x1f3c5;2021年2022年C站百大博主 &#x1f3c5;华为云开发…

华为OD机试真题——斗地主之顺子(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

Qt找不到windows API报错:error: LNK2019: 无法解析的外部符号 __imp_OpenClipboard

笔者在开发中出现的bug完整报错如下&#xff1a; spcm_ostools_win.obj:-1: error: LNK2019: 无法解析的外部符号 __imp_OpenClipboard&#xff0c;函数 "void __cdecl spcmdrv::vCopyToClipboard(char const *,unsigned __int64)" (?vCopyToClipboardspcmdrvYAXPE…

4.8.4 利用Spark SQL实现分组排行榜

在本次实战中&#xff0c;我们的目标是利用Spark SQL实现分组排行榜&#xff0c;特别是计算每个学生分数最高的前3个成绩。任务的原始数据由一组学生成绩组成&#xff0c;每个学生可能有多个成绩记录。我们首先将这些数据读入Spark DataFrame&#xff0c;然后按学生姓名分组&am…

[PyMySQL]

掌握pymysql对数据库实现增删改查数据库工具类封装,数据库操作应用场景数据库操作应用场景 校验测试数据 : 删除员工 :构造测试数据 : 测试数据使用一次就失效,不能重复使用 : 添加员工(is_delete)测试数据在展开测试前无法确定是否存在 : 查询,修改,删除员工操作步骤:!~~~~~~~…