通过率 66% · 提交 523 · 通过 343
小慕正在维护一个 n*m 的服务器机房,机房布局可以用一个整数矩阵网格来表示,其中 1 表示该单元格有一台服务器,0 表示没有。如果两台服务器位于同一行或者同一列中相邻的位置,那么它们可以组成一个。现在小慕需要统计整个机房中,包含多少台服务器。
这类题属于华为 OD 机考真题方向中「200分 / DFS」方向的高频题型,通常考察对「200分 / DFS」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行输入两个正整数,n和m,0 < n,m <= 100
之后为n*m的二维数组,代表服务器信息
最大局域网包含的服务器个数。
示例 1
输入示例
2 2 1 0 1 1
输出示例
3
[0][0]、[1][0]、[1][1]三台服务器相互连接,可以组成局域网
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
注意,本题和 经典题型(岛屿的最大面积)完全一致,直接套用模板即可。
使用 深度优先搜索(DFS) 遍历网格中的每个格子。当遇到值为 1 的格子时,说明发现了一个岛屿,此时从该格子出发,递归地访问所有相邻的 1,并统计该岛屿的面积。
核心步骤:
1. 遍历整个网格,对每个格子调用 DFS。 2. 在 DFS 中,如果当前格子越界或值为 0,则返回 0。 3. 否则,将当前格子标记为 0(避免重复访问),并递归访问其上下左右四个相邻格子。 4. 返回当前格子面积 1 加上四个方向递归返回的面积之和。 5. 在遍历过程中,记录并更新最大岛屿面积。
关键代码片段如下:
注意:标记已访问的格子为 0 是避免重复计算的关键,否则会导致无限递归。
思路展开 参考代码用 DFS 求网格中最大连通块的大小,和「岛屿的最大面积」是同一个模板。主函数用双重循环扫描整个 n × m 网格,checkList 数组记录每个格子是否已被访问。当遇到一个值为 1 且未访问的格子时,说明发现了一个新的局域网:先把计数器 area 清零,再从这个格子进入 DFS。DFS 每进入一个格子,就立刻在 checkList 上做标记并把 area 加一,然后沿 DIRECTIONS 定义的上、下、左、右四个方向尝试递归,只有当邻格在边界内、未被访问且值为 1 时才继续深入。这样一轮 DFS 恰好走遍当前连通块里的每一台服务器,结束时 area 就是这个局域网包含的服务器数。每处理完一个连通块,用 ans = Math.max(ans, area) 更新答案,最终输出的 ans 即最大局域网的规模。这份实现与正文示例中「把访问过的格子改成 0」的写法等价,只是改用独立的 checkList 做标记,不破坏原始网格数据。
复杂度分析 设网格为 n 行 m 列。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有