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