🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员
✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解
💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导
👏 感谢大家的订阅➕ 和 喜欢💗
📎在线评测链接
https://app5938.acapp.acwing.com.cn/contest/2/problem/OD1074
🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系清隆解锁~
🍓OJ题目截图
文章目录
- 📎在线评测链接
- 🍓OJ题目截图
- ☕️ 局域网中的服务器个数
- 题目描述
- 输入格式
- 输出格式
- 样例输入
- 样例输出
- 样例解释
- 数据范围
- 题解
- 参考代码
☕️ 局域网中的服务器个数
题目描述
在一个机房中,服务器的位置标识在 n ∗ m n*m n∗m 的整数矩阵网格中,1 表示单元格上有服务器,0 表示没有。如果两台服务器位于同一行或者同一列中紧邻的位置,则认为它们之间可以组成一个局域网。请你统计机房中最大的局域网包含的服务器个数。
输入格式
第一行输入两个正整数 n n n 和 m m m, 1 ≤ n , m ≤ 100 1 \le n,m \le 100 1≤n,m≤100。
接下来为 n ∗ m n*m n∗m 的二维数组,代表服务器信息。
输出格式
输出最大局域网包含的服务器个数。
样例输入
2 2
1 0
1 1
样例输出
3
样例解释
矩阵的第 0 列和第 1 行包含了三台服务器,它们相互连接,可以组成局域网。
数据范围
- 1 ≤ n , m ≤ 100 1 \le n,m \le 100 1≤n,m≤100
- 矩阵中的值为 0 或 1
题解
题目要求找到最大的局域网,并输出其中包含的服务器个数。我们可以使用深度优先搜索(DFS)来遍历矩阵,寻找所有连接的服务器。
具体步骤如下:
- 初始化:定义一个二维数组
vis
来标记访问状态,定义变量ans
来存储最大局域网的服务器个数。 - 定义方向数组:用
sx
和sy
来表示上下左右四个方向。 - 深度优先搜索(DFS):编写
dfs
函数,通过递归遍历所有相邻的服务器,并记录服务器个数。 - 遍历矩阵:对矩阵的每个元素进行遍历,如果当前元素是服务器且未访问过,调用
dfs
函数计算当前局域网的服务器个数,并更新最大局域网的服务器个数。
通过上述步骤,可以找到最大的局域网并输出其包含的服务器个数。
参考代码
- Python
n, m = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(n)]
visited = [[0] * m for _ in range(n)]
max_servers = 0
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]def dfs(x, y):count = 1stack = [(x, y)]while stack:cx, cy = stack.pop()for i in range(4):nx, ny = cx + dx[i], cy + dy[i]if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny] and matrix[nx][ny] == 1:visited[nx][ny] = 1count += 1stack.append((nx, ny))return countfor i in range(n):for j in range(m):if matrix[i][j] == 1 and not visited[i][j]:visited[i][j] = 1max_servers = max(max_servers, dfs(i, j))print(max_servers)
- Java
import java.util.*;public class Main {static int[] dx = {0, 0, 1, -1};static int[] dy = {1, -1, 0, 0};static int n, m;static int[][] matrix;static boolean[][] visited;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();matrix = new int[n][m];visited = new boolean[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {matrix[i][j] = sc.nextInt();}}int maxServers = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (matrix[i][j] == 1 && !visited[i][j]) {maxServers = Math.max(maxServers, dfs(i, j));}}}System.out.println(maxServers);}static int dfs(int x, int y) {int count = 1;Stack<int[]> stack = new Stack<>();stack.push(new int[]{x, y});visited[x][y] = true;while (!stack.isEmpty()) {int[] current = stack.pop();int cx = current[0];int cy = current[1];for (int i = 0; i < 4; i++) {int nx = cx + dx[i];int ny = cy + dy[i];if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && matrix[nx][ny] == 1) {stack.push(new int[]{nx, ny});visited[nx][ny] = true;count++;}}}return count;}
}
- Cpp
#include <iostream>
#include <vector>
#include <stack>
using namespace std;int n, m;
vector<vector<int>> matrix;
vector<vector<bool>> visited;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};int dfs(int x, int y) {int count = 1;stack<pair<int, int>> s;s.push({x, y});visited[x][y] = true;while (!s.empty()) {int cx = s.top().first;int cy = s.top().second;s.pop();for (int i = 0; i < 4; ++i) {int nx = cx + dx[i];int ny = cy + dy[i];if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && matrix[nx][ny] == 1) {s.push({nx, ny});visited[nx][ny] = true;count++;}}}return count;
}int main() {cin >> n >> m;matrix.resize(n, vector<int>(m));visited.resize(n, vector<bool>(m, false));for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {cin >> matrix[i][j];}}int maxServers = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (matrix[i][j] == 1 && !visited[i][j]) {maxServers = max(maxServers, dfs(i, j));}}}cout << maxServers << endl;return 0;
}