可以组成网络的服务器
题目描述
在一个机房中,服务器的位置标识在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] 三台服务器互相连接,可以组成局域网。
题解
如果两台服务器位于同一行或者同一列中紧邻的位置(其实就是处于上下左右的位置),可以使用并查集对紧邻的位置进行合并,然后再遍历找到服务器数量最大的并查集(并查集写法此题没有DFS简单)。
此题使用 DFS进行深搜,搜索过后将位置的值从1变成0。
C++
#include<iostream>
#include<vector>
using namespace std;
int dfs(vector<vector<int>>& grid, int i, int j) {
if (i < 0 || i >= grid.size() || j < 0 || j >= grid[0].size() || grid[i][j] == 0) {
return 0;
}
// 标记当前服务器已访问
grid[i][j] = 0;
int cnt = 1;
// 向上、向下、向左、向右进行深度优先搜索
cnt += dfs(grid, i - 1, j);
cnt += dfs(grid, i + 1, j);
cnt += dfs(grid, i, j - 1);
cnt += dfs(grid, i, j + 1);
return cnt;
}
int main() {
int m, n;
cin >> m >> n;
vector<vector<int>> grid(m, vector<int>(n));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> grid[i][j];
}
}
int maxServers = 0;
// 遍历整个矩阵
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1) {
// 使用深度优先搜索统计每个局域网的服务器数量
maxServers = max(maxServers, dfs(grid, i, j));
}
}
}
cout << maxServers << endl;
return 0;
}
#面经##笔试##春招##校招##华为#整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏
C++笔试真题题解 文章被收录于专栏
笔试真题题解