华为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四种语言的解法。