华为OD机试 - 聚餐地点 - 广度优先搜索BFS(Python/JS/C/C++ 2024 D卷 200分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

一、题目描述

小华和小为是很好的朋友,他们约定周末一起吃饭,通过手机交流,他们在地图上选择了很多聚餐地点 (由于自然地形等原因,部分聚餐地点不可达),求小华和小为都能达到的聚餐地点有多少个。

二、输入描述

第一行输入 m

### 题目描述 智能汽车可以上下左右四个方向移动,地图上的数字取值是 0 或 -1 或正整数: - -1 :表示加油站,可以加满油,汽车的油箱容量最大为 100; - 0 :表示这个地区是障碍物,汽车不能通过; - 正整数:表示汽车走过这个地区的耗油量。 如果汽车无论如何都无法到达终点,则返回 -1 [^1]。 ### 示例解析 输入示例: ```plaintext 2 2 10 20 30 40 ``` 2 2 表示地图是 2 行 2 列的。接下来的两行数字表示地图的具体内容:10 20 30 40 ,起点在(0, 0),耗油量为 10。终点在(1, 1),耗油量为 40。从起点到终点只有一条路径,即(0, 0) -> (1, 1)。 输出示例: ```plaintext 70 ``` 解析:从起点(0, 0)出发,耗油量为 10,到达(1, 1)耗油量为 40,总共需要初始油量 70 [^2]。 ### 解题思路 可以使用广度优先搜索BFS)来解决这个问题。具体步骤如下: 1. 初始化队列,将起点及初始油量信息加入队列。 2. 定义方向数组,用于表示上下左右四个方向。 3. 遍历队列,取出当前位置和油量信息。 4. 检查当前位置是否为终点,如果是则更新最小初始油量。 5. 遍历四个方向,计算新位置和新油量。 6. 检查新位置是否合法(在地图范围内、不是障碍物),如果是加油站则加满油。 7. 如果新油量大于 0 且新状态未被访问过,则将新状态加入队列。 ### 代码示例(Python) ```python from collections import deque def min_initial_fuel(grid): rows, cols = len(grid), len(grid[0]) # 定义四个方向:上、下、左、右 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 初始化最小初始油量为无穷大 min_fuel = float('inf') # 初始化队列,队列元素为 (x, y, current_fuel, initial_fuel) queue = deque([(0, 0, 0, 0)]) # 初始化访问集合,记录已经访问过的状态 visited = set() while queue: x, y, current_fuel, initial_fuel = queue.popleft() # 如果到达终点,更新最小初始油量 if x == rows - 1 and y == cols - 1: min_fuel = min(min_fuel, initial_fuel) continue # 遍历四个方向 for dx, dy in directions: new_x, new_y = x + dx, y + dy # 检查新位置是否合法 if 0 <= new_x < rows and 0 <= new_y < cols and grid[new_x][new_y] != 0: new_fuel = current_fuel if grid[new_x][new_y] == -1: # 如果是加油站,加满油 new_fuel = 100 else: # 否则消耗油量 new_fuel -= grid[new_x][new_y] # 如果新油量小于 0,需要增加初始油量 if new_fuel < 0: initial_fuel += abs(new_fuel) new_fuel = 0 # 新状态 new_state = (new_x, new_y, new_fuel, initial_fuel) # 如果新状态未被访问过,加入队列 if new_state not in visited: visited.add(new_state) queue.append(new_state) # 如果无法到达终点,返回 -1 return min_fuel if min_fuel != float('inf') else -1 # 示例输入 grid = [ [10, 20], [30, 40] ] print(min_initial_fuel(grid)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值