[华为OD]BFS C卷 200 智能驾驶

题目:

有一辆汽车需要从m*n的地图的左上角(起点)开往地图的右下角(终点),去往每一个地区都需 

要消耗一定的油量,加油站可进行加油

请你计算汽车确保从起点到达终点时所需的最少初始油量说明:

(1)智能汽车可以上下左右四个方向移动1

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

-1:表示加油站,可以加满油,汽车的油箱容量最大为100;

0:表示这个地区是障碍物,汽车不能通过

正整数:表示汽车走过这个地区的耗油量

⑶如果汽车无论如何都无法到达终点,则返回-1

输入描述

第一行为两个数字,M, V,表示地图的大小为M,N(0< M,N < 200)

后面一个M*N的矩阵,其中的值是0或-1或正整数,加油站的总数不超过200个

输出描述

如果汽车无论如何都无法到达终点,则返回-1

如果汽车可以到达终点,则返回最少的初始油量

示例1 

输入

2,2 

10,20 

30,40

输出

70

示例2 

输入

4,4 

10,30,30,20 

30,30,-1,10 

0,20,20,40

10,-1,30,40 

输出

70

示例3

输入

4,5

10,0,30,-1,10 

30,0,20,0,20 

10,0,10,0,30 

10,-1,30,0,10 

输出

60

示例4

输入

4,4

10,30,30,20 

30,30,20,10 

10,20,10,40 

10,20,30,40 

输出

-1

题解:这个题目要计算最少初始油料,那么如果经过加油站的话,明显就要直接加满油。

比较明显的BFS题目。但是需要判断到加油站的情况。由于油箱容量100,那么我们出发时候就将当前油量设置为100。

依旧还是需要定义一个内部类,参数有x,y坐标。这个里面就加了,初始油量originalOil,当前坐标走完需要油量needOil,也就是矩阵中当前的值。以及汽车在这个坐标的剩余油量restOil,还有一个bool值,是否有在加油站加过油。

1)如果到加油站时候,车辆没有加过油,那么从出发到这个加油站的初始油量(刚出发时候初始油量)就可以变为100减去当前剩余油量了。

2)当BFS向下一坐标搜索的时候,如果restOil剩余油量不足以满足去下一个坐标需要的油量needOil,那么就继续往下搜索

3)在到终点的时候,如果没有加过油,那么如果剩余油量>0,那么这个路径走下来的初始油量应该可以变成100减去当前剩余油量

4)当走到任意坐标时候,油量足够,而且汽车加过油,那么初始油量应该不变,因为加过油,剩余油量在加油站那个坐标直接变为100了

5)走过一个坐标,那么这个坐标访问标记visit[x][y]=1;

这个里面可以看到有一个难点就是可能有两条路线能经过同一个加油站,两条路径油量不同,如何确保最终是最少油量经过这个加油站。这边采用的是一个map<String,Integer> oilStations来解决表示的是这个加油站坐标和来这个加油站最少得油量。因为在初始化扫描的时候当矩matrixs[i][j]==-1,就是加油站,那么此时就初始化这个加油站油量为Integer.MaxValue.

6)那么在经过加油站的坐标时候,加油站坐标的visit[x][y],还是为0,不能变为1,防止其他路径更少油量,由于visit[x][y]==1,而不能到加油站,结果就不对。此时,先根据oilStations,拿到抵达这个加油站当前的最少油量prsentL

华为OD考试作为华为公司用于选拔技术人才的一种方式,其不同试版本(如C)通常涵盖编程能力测试、算法理解与应用、以及实际问题解决能力的评估。虽然具体的题目和内容会根据实际情况进行调整,但整体结构和考察重点具有一定的规律性。 ### 考试内容解析 #### 1. **编程能力测试** 华为OD考试C通常包含多道编程题,主要考察候选人的编程能力和对常见数据结构与算法的掌握。题目类型可能包括数组操作、字符串处理、链表操作、树和图的遍历等。考试中要求使用一种或多种编程语言(如C++、Java、Python)实现算法,并确保代码的正确性和效率。 例如,一道典型的数组操作题目可能要求在给定的整数数组中查找满足特定条件的子数组或元素组合,并要求时间复杂度尽可能低。 #### 2. **算法理解与应用** 考试中会涉及常见的算法思想,包括但不限于贪心算法、动态规划、深度优先搜索(DFS)、广度优先搜索(BFS)等。对于这些问题,除了写出正确的代码外,还要求理解算法的时间复杂度和空间复杂度,并能根据题目要求进行优化。 例如,动态规划题目可能要求计算某个问题的最优解,如最长递增子序列(LIS)或背包问题。 #### 3. **实际问题解决能力** 华为OD考试还会设置一些贴近实际应用场景的问题,考察候选人分析问题、建模和解决问题的能力。这类题目通常需要将实际问题转化为标准的算法问题,并设计相应的解决方案。 例如,可能会要求设计一个调度算法来优化任务分配,或者设计一个系统来处理大规模数据。 ### 考试注意事项 - **熟悉编程环境**:建议提前熟悉考试平台的编程环境,避免因不熟悉操作而影响发挥。 - **注重代码质量**:代码不仅要正确运行,还需要具备良好的可读性和注释,以便于评审人员理解。 - **时间管理**:考试时间有限,合理分配时间,优先解决简单或熟悉的题目。 ### 刷题建议 根据华为OD考试的特点,建议按照算法分类进行刷题,例如: - **数组与字符串**:掌握常见的操作技巧,如双指针法、滑动窗口等。 - **链表与树**:熟练实现链表反转、树的遍历等操作。 - **动态规划**:理解状态转移方程的设计方法。 - **图论**:掌握图的遍历和最短路径算法。 ```python # 示例:动态规划解最长递增子序列(LIS) def length_of_lis(nums): if not nums: return 0 dp = [1] * len(nums) for i in range(len(nums)): for j in range(i): if nums[i] > nums[j]: dp[i] = max(dp[i], dp[j] + 1) return max(dp) ``` ### 相关问题 1. 华为OD考试中动态规划题目的常见解法有哪些? 2. 如何高效准备华为OD考试中的编程题? 3. 华为OD考试中有哪些常见的数据结构应用场景?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值