华为OD机考双机位C卷 - 可以组成网络的服务器 (Java & Python & JS & GO & C++ & C)
# 可以组成网络的服务
2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷
华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)
题目描述
在一个机房中,服务器的位置标识在 n*m 的整数矩阵网格中,1 表示单元格上有服务器,0 表示没有。如果两台服务器位于同一行或者同一列中紧邻的位置,则认为它们之间可以组成一个局域网。
请你统计机房中最大的局域网包含的服务器个数。
输入描述
第一行输入两个正整数,n和m,0<n,m<=100
之后为n*m的二维数组,代表服务器信息
输出描述
最大局域网包含的服务器个数。
用例1
输入
2 2
1 0
1 1
输出
3
[0][0]、[1][0]、[1][1]三台服务器相互连接,可以组成局域网
解题思路
题目分析
题目要求我们在一个 $n \times m$ 的矩阵中,找到最大的局域网包含的服务器个数。
这里的“局域网”定义为:如果两台服务器位于同一行或者同一列中紧邻的位置(即上下左右相邻),则认为它们可以组成一个局域网。
实际上,这是一个求最大连通块的问题。
- 节点:矩阵中值为 1 的单元格(代表服务器)。
- 边:如果两个值为 1 的单元格相邻(上下左右),则它们之间有一条边。
- 连通块:相互连接的一组服务器。
- 目标:找到包含节点数最多的连通块,输出其节点数量。
算法策略:深度优先搜索 (DFS)
我们可以遍历矩阵中的每一个位置:
- 如果当前位置是服务器(值为 1)且未被访问过,说明我们发现了一个新的连通块。
- 从该位置开始,使用 DFS(深度优先搜索) 或 BFS(广度优先搜索)来遍历属于该连通块的所有服务器。
- 在遍历过程中,统计该连通块包含的服务器数量,并将访问过的服务器标记为
visited(或直接修改矩阵的值为 0),防止重复计算。 - 每次遍历完一个连通块后,更新最大局域网的大小
ans = max(ans, current_size)。
具体步骤
-
初始化:
- 读取 $n$ 和 $m$。
- 读取 $n \times m$ 的矩阵
server。 - 创建一个同尺寸的布尔矩阵
visited用于标记访问状态(或者直接在server矩阵上修改,访问过置为 0)。
-
遍历矩阵:
- 使用双重循环遍历
i从 $0$ 到 $n-1$,j从 $0$ 到 $m-1$。 - 如果
server[i][j] == 1且!visited[i][j]:- 启动 DFS:
count = dfs(i, j)。 - 更新最大值:
ans = max(ans, count)。
- 启动 DFS:
- 使用双重循环遍历
-
DFS 函数
dfs(i, j):- 基准情况:如果坐标
(i, j)越界,或者server[i][j] == 0,或者visited[i][j]为真,则返回 0。 - 标记访问:
visited[i][j] = true。 - 递归搜索:
count = 1(当前节点)。count += dfs(i-1, j)(上)。count += dfs(i+1, j)(下)。count += dfs(i, j-1)(左)。count += dfs(i, j+1)(右)。
- 返回结果:返回
count。
- 基准情况:如果坐标
-
输出结果:输出
ans。
复杂度分析
- 时间复杂度:$O(n \times m)$。每个单元格最多被访问一次。
- 空间复杂度:$O(n \times m)$。需要额外的
visited数组(如果修改原数组则不需要)以及递归调用栈的空间(最坏情况下为 $O(n \times m)$)。
浙公网安备 33010602011771号