通过率 54% · 提交 368 · 通过 199
小慕拿到了一张 m × n 的整数地图,中的每个数值代表该位置的地形高度。 小慕可以从地图上的任意一点出发,尝试向上、下、左、右四个相邻的格子移动。 移动时需遵守以下规则: 小慕只能上坡或下坡,不能移动到高度相同的格子。 不允许连续上坡或连续下坡,必须交替进行。 每个格子只能经过一次,不能重复访问。 请计算小慕在这张地图上,能够连续移动的最大次数。
这类题属于华为 OD 机考真题方向中「100分 / 回溯」方向的高频题型,通常考察对「100分 / 回溯」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行两个数字,分别为行数和每行的列数
后续数据为矩阵地图内容
矩阵边长范围:[1,8]
地形高度范围:[0,100000]
一个整数,代表中庸行者在本地图内,能连续移动的最大次数。
示例 1
输入示例
2 2 1 2 4 3
输出示例
3
3->4->1->2,一共移动3次。
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
本题数据规模较小,最多只有 **8 * 8 = 64 个点,因此可以使用 DFS 回溯** 的方式枚举出所有路径。
checkList 的更新需要 回滚。path_len 来记录当前路径长度的变化,可以直接将 `path_len + 1` 作为回溯的参数传入。回溯调用的入口需要同时考虑 第一步是上坡还是下坡 的情况。因此,对于每一个特定的点 (i, j),其回溯入口都需要调用两次,分别设置 isUp 为 True 和 False。
---
PS:中庸真的是华子的核心价值观呀,连做题都要中庸(。 PSS:本题是 2023 年华为秋招 的笔试题目,分值 200 分。
思路展开
代码的主体是一个带状态回滚的回溯函数 backtracking,外加双重循环枚举所有出发点。关键参数:(i, j) 是当前所在格子;checkList 是与地图同尺寸的访问标记数组;path_len 是从起点走到当前格子已完成的移动次数;isUp 是布尔标志,表示下一步必须上坡(True)还是必须下坡(False)。 每次进入回溯函数,先用 path_len 更新全局答案 ans——这样任何一条中途路径的长度都会被记录,不必等走到死路。然后枚举上下左右四个近邻 (ni, nj):要求不越界、未访问过,且高度满足当前方向约束(isUp 时必须严格更高,否则必须严格更低)。满足则把该格标记为已访问,携带 path_len+1 和取反后的 isUp 递归下去——isUp 取反正是「上坡下坡必须交替」的实现;递归返回后把标记改回 0,让该格子还能出现在同一起点出发的其他路径中。 主程序对每个格子 (i, j) 重建一份 checkList 并标记起点本身,然后分别以「第一步上坡」「第一步下坡」各调用一次回溯入口,保证两种开局都被枚举。
复杂度分析
设地图为 m 行 n 列。回溯枚举的是所有满足高度交替约束的简单路径,路径条数最坏随格子数指数增长:搜索树深度最多 m*n,每层至多 3 个有效分支(不能立即走回来路,方向与访问约束还会进一步剪枝),再乘上 m*n 个起点和 2 种开局方向,最坏时间约为 O(m*n * 3^(m*n)) 量级,是指数级算法。正如上文所说,本题数据规模很小(最多 8×8 = 64 个格子),加上「严格交替上下坡」这一强剪枝,实际搜索空间远小于理论上界,可以在时限内完成。 空间复杂度为 O(m*n):checkList 与地图同尺寸,递归栈深度不超过一条路径的长度,即至多 m*n。
边界与注意事项
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有