华为OD统一考试 - 可以组成网络的服务器

题目描述

在一个机房中,服务器的位置标识在 n*m 的整数矩阵网格中,1 表示单元格上有服务器,0 表示没有。如果两台服务器位于同一行或者同一列中紧邻的位置,则认为它们之间可以组成一个局域网。

请你统计机房中最大的局域网包含的服务器个数。

输入描述

第一行输入两个正整数,n和m,0<n,m<=100

之后为n*m的二维数组,代表服务器信息

输出描述

最大局域网包含的服务器个数。

用例

输入

2 2

1 0

1 1

输出

3

说明

[0][0]、[1][0]、[1][1]三台服务器相互连接,可以组成局域网

题目解析

本题可以用深度优先搜索DFS求解。

我们找到一个服务器后,就再去其上下左右找下一个服务器,当找到新服务器,再递归去找其上下左右,按此逻辑,就像拔地瓜藤一样,一下子把所有地瓜都拔出来。而这就是深度优先搜索,即dfs。

为了避免重复统计,我们将统计过的服务器位置的值从1变为0。


import Foundation
func ODTest_2_51() {
    print("输入描述")
    print("第一行输入两个正整数,n和m,0<n,m<=100")
    let nm = (readLine() ?? "").split(separator: " ").map { Int($0) ?? 0 }
    if nm.count != 2 {
        print("0")
        return
    }
    let n = nm[0], m = nm[1]
    print("之后为n*m的二维数组,代表服务器信息")
    print("第二行开始,是M行N列的像素的二维数组,仅包含像素1和5")
    var matrix = Array(repeating: Array(repeating: 0, count: m), count: n)
    for i in 0 ..< n {
        matrix[i] = (readLine() ?? "").split(separator: " ").map { Int($0) ?? 0 }
    }

    print("最大局域网包含的服务器个数。")
    let offsets = [
        [-1, 0],
        [1, 0],
        [0, -1],
        [0, 1],
    ]
    
    print("\(getResult())")
    
    func getResult() -> Int {
        var ans = 0
        for i in 0 ..< n {
            for j in 0 ..< m {
                if matrix[i][j] == 1 {
                    ans = max(ans, bfs(i, j))
                }
            }
        }
        return ans
    }
    

    func bfs(_ i: Int, _ j: Int) -> Int {
        var count = 1
        matrix[i][j] = 0
        
        var queue: [[Int]] = [[i, j]]
        
        while !queue.isEmpty {
            var xy = queue.removeFirst()
            
            for offset in offsets {
                let newX = xy[0] + offset[0]
                let newY = xy[1] + offset[1]
                
                if
                    newX >= 0 &&
                    newX < n &&
                    newY >= 0 &&
                    newY < m &&
                    matrix[newX][newY] == 1
                {
                    count += 1
                    matrix[newX][newY] = 0
                    queue.append([newX, newY])
                }
            }
        }
        
        return count
    }
}

2024华为OD机试卷题 文章被收录于专栏

本专栏给大家提供了华为2024最新华为OD 题目汇总。华为OD机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务