直捣黄龙
2026 华为OD机试真题 4月8日华为OD上机新系统考试真题 200 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
小王在玩一款叫做直捣黄龙的小游戏,在该游戏中他需要从入口位置进入敌营,绕过哨兵的层层封锁,达到敌军司令部实施斩首行动。
敌军阵营是一个 的矩阵,入口在坐标 ,敌军司令部在坐标 ,每个哨兵警戒以自己为中心的9宫格,一旦被哨兵发现则行动失败。
同时穿越敌营耗时越长,被发现的概率越高,因此小王需要寻找到可以绕过警戒到达敌军司令部的最短路径。
请你设计一个小程序,帮助小王统计这样的路径有多少条,以及路径长度。
规则说明:
1.其中 为大于 的奇数且取值小于 ,坐标 取值均从 开始,敌营左下角定义为 ,右上角定义为 .
2.敌营入口在坐标 ,敌军司令部在坐标 。
3.游戏角色的行动方向只包含上、下、左、右四个方向,即一次行动 坐标不可同时变化。
4.在没有满足题目要求的可达路径时,需要返回{}。
输入描述
参数 ,敌军阵营的边长 。
参数 ,哨兵位置列表 {表示行坐标, 表示列坐标。
输出描述
两个成员的数组,第一个成员为最短路径条数,第二个成员为最短路径长度
示例1
输入
3,[(1,1)]
输出
[0,0]
说明
无路径场景,S 表示哨兵位置,A* 表示起点,E* 表示终点,哨兵警戒了全图
/无可达路径,因此返回为{0,0}
示例2
输入
5,[(2,1)]
输出
[1,7]
说明
单一最短路径场景,S 表示哨兵位置,A* 表示起点,E* 表示终点
最短路径:[(0,2),(0,3),(1,3),(2,3),(3,3),(4,3),(4,2)][(0,2),(0,3),(1,3),(2,3),(3,3),(4,3),(4,2)]
因此返回值为{1,7}
示例3
输入
5,[(2,2)]
输出
[2,9]
说明
两条最短路径,S 表示哨兵位置,A 表示起点,E* 表示终点
路径1:[(0,2),(0,1),(0,0),(1,0),(2,0),(3,0),(4,0),(4,1),(4,2)][(0,2),(0,1),(0,0),(1,0),(2,0),(3,0),(4,0),(4,1),(4,2)]
路径2:[(0,2),(0,3),(0,4),(1,4),(2,4),(3,4),(4,4),(4,3),(4,2)][(0,2),(0,3),(0,4),(1,4),(2,4),(3,4),(4,4),(4,3),(4,2)]
因此返回值为{2,9}
解题思路
核心思想
题目要求在 的网格中寻找从入口 到司令部 的最短路径条数及长度。
关键点如下:
- 哨兵警戒区:每个哨兵位于 ,其警戒范围是以其为中心的 宫格。这意味着坐标在 和 范围内的所有点都是不可通行的障碍物。
- 网格坐标:入口在 ,司令部在 。坐标系规定左下角为 ,右上角为 。
- 路径长度定义:根据示例分析,路径长度指的是路径上点的个数(即 步数 + 1)。
- 算法选择:
- BFS (广度优先搜索) 是寻找无权图(或等权图)最短路径的最佳选择。
- 在 BFS 过程中,我们需要同时维护两个信息:
dist[x][y]:从起点到点 的最短距离。count[x][y]:从起点到点 的最短路径条数。
- BFS 逻辑:
- 初始化
dist为无穷大,count为 0。 - 起点
dist[start] = 1(按点数算),count[start] = 1。 - 对于当前点 的邻居 :
- 如果
dist[nx][ny] > dist[x][y] + 1:说明找到了更短的路径,更新dist[nx][ny] = dist[x][y] + 1,并令count[nx][ny] = count[x][y]。 - 如果
dist[nx][ny] == dist[x][y] + 1:说明找到了另一条相同长度的最短路径,累加计数count[nx][ny] += count[x][y]。
- 如果
- 初始化
复杂度分析
- 时间复杂度:。我们需要预处理所有哨兵的警戒范围,并进行一次 BFS 遍历。由于 ,网格大小最多为 个点。
- 空间复杂度:。用于存储网格的障碍物信息、距离数组和路径计数数组。