通过率 56% · 提交 347 · 通过 195
小慕有一个 m 行 n 列的棋盘。他输入了棋盘上的数据。棋盘上每个格子要么是数字,要么是字符“.”。数字表示该格子上有一匹马,数字的值表示这匹马最多能移动的步数;字符“.”表示该格子是空的。 例如,如果棋盘上某个位置的数字是 k,表示该马每次移动时,可以走 1 到 k 步中的任意一个步数。 棋盘上马的移动规则类似于中国象棋中的马:先沿水平或垂直方向移动一格,再沿对角线方向移动一格。 马可以移动到同一个格子,同一个格子上可以同时有多匹马。 小慕想知道:是否可以将棋盘上所有的马都移动到同一个格子?如果可以,输出移动所需的最小总步数;如果不可以,输出 0。
这类题属于华为 OD 机考真题方向中「200分 / 2024E」方向的高频题型,通常考察对「200分 / 2024E」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入m 和 n 两个数,m 和 n 表示一个 m*n 的棋盘。输入棋盘内的数据。
能否将棋盘上所有的马移动到同一个位置,若可以请输入移动的最小步数。若不可以输出 0。
示例 1
输入示例
3 5 4 7 . 4 8 4 7 4 4 . 7 . . . .
输出示例
17
示例 2
输入示例
3 2 . . 2 . . .
输出示例
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
假设已知某匹马的坐标和最大跳跃步数,则可以用 BFS 计算出该匹马能够到达地图上某个点的 最小步数。比如对于以下初始位于 (0, 0) 位置、最多能跳 4 步的马:
考虑它跳跃到地图上各个点所花费的步数:
跳跃 0 步
跳跃 1 步
跳跃 2 步
跳跃 3 步
跳跃 4 步
因此可以通过 BFS 过程得到这匹马可以到达的最终状态。其代码如下:
对于每一匹马,都可以计算出对应的二维矩阵 mat。考虑多匹马的情况,将所有马的 mat 叠加成一个总的二维矩阵 ans_mat,对于每一个点 (x, y) 而言,其逻辑如下:
ans_mat[x][y] 已经为 -1,说明有其他马无法到达点 (x, y)mat[x][y] 为 -1,说明这匹马无法到达点 (x, y),将 ans_mat[x][y] 改为 -1ans_mat[x][y] 和 mat[x][y] 均不为 -1,则将 mat[x][y] 叠加到 ans_mat[x][y] 中考虑 2 匹马的简单例子,可以从以下例子看出上述逻辑。假设初始矩阵为:
那么位置为 (0, 0) 的马的最终可到达情况矩阵 mat 为:
位置为 (1, 2) 的马的最终可到达情况矩阵 mat 为:
其中 -1 用 . 来表示。两者的叠加结果为:
可以看出,所有马跳到同一个位置的最小的步数就为 1。
复杂度分析 设棋盘为 m 行 n 列,棋盘上共有 h 匹马(即数字格子的个数,h 最大可达 m*n)。对每一匹马调用一次 bfs4SingleHorse:该 BFS 中 mat 数组兼做检查数组,每个格子至多入队一次,每次出队检查 8 个「日」字方向,故单次 BFS 为 O(m*n);随后把这匹马的 mat 叠加进 ans_mat 又是一次 O(m*n) 的双重遍历。因此主体部分为 O(h*m*n),最坏情况下(几乎格格都是马)达到 O(m^2*n^2),这是整个算法的瓶颈。最后扫一遍 ans_mat 取非 -1 位置的最小值是 O(m*n),不影响量级。空间上,单匹马的 mat、叠加用的 ans_mat 以及 BFS 队列都是 O(m*n),每匹马的 mat 用完即可回收,故空间复杂度为 O(m*n)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
0
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有