可以组成网络的服务器

题目描述

在一个机房中,服务器的位置标识在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++笔试真题题解 文章被收录于专栏

笔试真题题解

全部评论

相关推荐

10-10 01:10
已编辑
深圳大学 测试开发
面了100年面试不知...:六月到九月,四个项目一个实习,是魔丸吗
投了多少份简历才上岸
点赞 评论 收藏
分享
笑着秋招😊:我一直认为努力有回报是一件很幸福很幸福的事情,恭喜你
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务