华为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. 如果当前位置是服务器(值为 1)且未被访问过,说明我们发现了一个新的连通块。
  2. 从该位置开始,使用 DFS(深度优先搜索) 或 BFS(广度优先搜索)来遍历属于该连通块的所有服务器。
  3. 在遍历过程中,统计该连通块包含的服务器数量,并将访问过的服务器标记为visited(或直接修改矩阵的值为 0),防止重复计算。
  4. 每次遍历完一个连通块后,更新最大局域网的大小 ans = max(ans, current_size)

具体步骤

  1. 初始化

    • 读取 $n$ 和 $m$。
    • 读取 $n \times m$ 的矩阵 server
    • 创建一个同尺寸的布尔矩阵 visited 用于标记访问状态(或者直接在 server 矩阵上修改,访问过置为 0)。
  2. 遍历矩阵

    • 使用双重循环遍历 i 从 $0$ 到 $n-1$,j 从 $0$ 到 $m-1$。
    • 如果 server[i][j] == 1!visited[i][j]
      • 启动 DFS:count = dfs(i, j)
      • 更新最大值:ans = max(ans, count)
  3. 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
  4. 输出结果:输出 ans

复杂度分析

  • 时间复杂度:$O(n \times m)$。每个单元格最多被访问一次。
  • 空间复杂度:$O(n \times m)$。需要额外的 visited 数组(如果修改原数组则不需要)以及递归调用栈的空间(最坏情况下为 $O(n \times m)$)。
posted @ 2026-03-09 22:58  华为od算法大师  阅读(2)  评论(0)    收藏  举报