通过率 66% · 提交 1,204 · 通过 793
小慕正在处理一个 N 行 M 列的二维网格,网格中每个格子里的数字要么是 0,要么是 1。例如,他面对的网格可能是这样的: 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 小慕需要把所有 1 变成 0,规则如下: 1. 当他一个 1 时,这个 1 会变成 0,同时它上、下、左、右以及左上、左下、右上、右下这 8 个方向上相邻的 1(如果有)也会自动变成 0。 2. 进一步地,任何一个 1 被变成 0 时,它周围 8 个方向上的 1(如果有)也会自动变成 0。 按照这个规则,上面这个网格只需要点击 2 次,就能让所有数字都变成 0。 现在,小慕想知道,给定任意一个这样的网格,最少需要点击几次,才能让所有数字都变成 0?
这类题属于华为 OD 机考真题方向中「100分 / DFS」方向的高频题型,通常考察对「100分 / DFS」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行输入两个整数,分别表示矩阵的行数 N 和列数 M,取值范围均为 [1,100]
接下来 N 行表示矩阵的初始值,每行均为 M 个数,取值范围 [0,1]
输出一个整数,表示最少需要点击的次数
示例 1
输入示例
3 3 1 0 1 0 1 0 1 0 1
输出示例
1
上述样例中,四个角上的 1 均在中间的 1 的相邻 8 个方向上,因此只需要点击一次即可。
示例 2
输入示例
4 4 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
注意,本题和 岛屿数量 几乎完全一致。唯一的区别在于,本题需要考虑 八个方向 而不是四个方向。
考虑八个方向时,我们需要定义方向数组为:
剩余过程就是常规的 DFS / BFS 过程。
1. 初始化 Checklist 2. 双重循环 遍历所有点作为 BFS 的起点:
(x, y)(x, y) 的近邻点(8 个方向):(nx, ny):(nx, ny)(nx, ny)1. 定义 DFS 函数,包含参数 (x, y):
(x, y)(x, y) 的近邻点(8 个方向):(nx, ny):(nx, ny)2. 初始化 Checklist 3. 双重循环 遍历所有点作为 DFS 的起点:
解法一:BFS
复杂度分析 设网格为 N 行 M 列。本题的答案等于值为 1 的八连通块的个数,每个连通块只需要点击一次。
与四方向的「岛屿数量」相比,方向数从 4 变成 8 只是常数因子变大,复杂度量级完全不变。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
输出示例
2
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有