#C202. 【华为OD机考 统一考试机试C卷】可以组成网络的服务器
【华为OD机考 统一考试机试C卷】可以组成网络的服务器
题目链接
【华为OD机考 统一考试机试C卷】可以组成网络的服务器(C++ Java JavaScript Python)
https://blog.csdn.net/banxia_frontend/article/details/134450587
题目描述
在一个机房中,服务器的位置标识在 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]三台服务器相互连接,可以组成局域网
C++
#include <iostream>
#include <vector>
using namespace std;
int n, m;
vector<vector<int>> server;
vector<vector<bool>> visited;
int dfs(int i, int j) {
if (i < 0 || i >= n || j < 0 || j >= m || server[i][j] == 0) {
return 0;
}
if (visited[i][j]) {
return 0;
}
visited[i][j] = true;
int count = 1;
count += dfs(i - 1, j);
count += dfs(i + 1, j);
count += dfs(i, j - 1);
count += dfs(i, j + 1);
return count;
}
int main() {
cin >> n >> m;
server.resize(n);
visited.resize(n);
for (int i = 0; i < n; i++) {
server[i].resize(m);
visited[i].resize(m, false);
for (int j = 0; j < m; j++) {
cin >> server[i][j];
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ans = max(ans, dfs(i, j));
}
}
cout << ans << endl;
return 0;
}
Java
import java.util.Scanner;
public class Main {
static int n, m;
static int[][] server; // 定义一个矩阵,用于存储服务器的状态
static boolean[][] visited; // 记录每个位置是否已经被访问过
// 定义一个深度优先搜索函数,用于搜索当前位置的连通块大小
public static int dfs(int i, int j) {
// 如果当前位置超出矩阵边界或者当前位置没有服务器,则返回0
if (i < 0 || i >= n || j < 0 || j >= m || server[i][j] == 0) {
return 0;
}
// 如果当前位置已经被访问过,则返回0
if (visited[i][j]) {
return 0;
}
// 标记当前位置为已访问
visited[i][j] = true;
// 分别向上、下、左、右四个方向递归搜索,并累加连通块大小
int count = 1; // 当前位置有服务器,将count初始化为1
count += dfs(i - 1, j); // 上
count += dfs(i + 1, j); // 下
count += dfs(i, j - 1); // 左
count += dfs(i, j + 1); // 右
return count;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读入矩阵的行数和列数
n = sc.nextInt();
m = sc.nextInt();
sc.nextLine();
server = new int[n][m];
visited = new boolean[n][m];
// 读入矩阵中每个位置的状态(0表示没有服务器,1表示有服务器)
for (int i = 0; i < n; i++) {
String line = sc.nextLine();
String[] nums = line.split(" ");
for (int j = 0; j < m; j++) {
server[i][j] = Integer.parseInt(nums[j]);
}
}
int ans = 0; // 定义一个变量,用于存储最大连通块大小
// 枚举矩阵中的每个位置,以该位置为起点进行深度优先搜索,并更新最大连通块大小
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ans = Math.max(ans, dfs(i, j));
}
}
// 输出最大连通块大小
System.out.println(ans);
}
}
javaScript
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let n, m;
let server = [];
let visited = [];
function dfs(i, j) {
if (i < 0 || i >= n || j < 0 || j >= m || server[i][j] === 0) {
return 0;
}
if (visited[i][j]) {
return 0;
}
visited[i][j] = true;
let count = 1;
count += dfs(i - 1, j);
count += dfs(i + 1, j);
count += dfs(i, j - 1);
count += dfs(i, j + 1);
return count;
}
rl.on('line', (line) => {
if (!n) {
[n, m] = line.split(' ').map(Number);
visited = new Array(n).fill(false).map(() => new Array(m).fill(false));
} else {
server.push(line.split(' ').map(Number));
if (server.length === n) {
let ans = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
ans = Math.max(ans, dfs(i, j));
}
}
console.log(ans);
rl.close();
}
}
});
python
import sys
def dfs(i, j):
if i < 0 or i >= n or j < 0 or j >= m or server[i][j] == 0:
return 0
if visited[i][j]:
return 0
visited[i][j] = True
count = 1
count += dfs(i - 1, j)
count += dfs(i + 1, j)
count += dfs(i, j - 1)
count += dfs(i, j + 1)
return count
n, m = map(int, input().split())
server = []
visited = []
for i in range(n):
line = input().split()
server.append([int(x) for x in line])
visited.append([False] * m)
ans = 0
for i in range(n):
for j in range(m):
ans = max(ans, dfs(i, j))
print(ans)
C语言
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100
int n, m;
int server[MAX_SIZE][MAX_SIZE];
bool visited[MAX_SIZE][MAX_SIZE];
// 深度优先搜索(DFS)函数,用于计算从(i, j)位置开始能够形成的局域网大小
int dfs(int i, int j) {
// 如果坐标越界或者当前位置没有服务器,返回0
if (i < 0 || i >= n || j < 0 || j >= m || server[i][j] == 0) {
return 0;
}
// 如果当前位置已经访问过,也返回0
if (visited[i][j]) {
return 0;
}
// 标记当前位置为已访问
visited[i][j] = true;
// 从当前位置开始,局域网的大小至少为1
int count = 1;
// 递归地搜索上下左右四个方向,并累加局域网的大小
count += dfs(i - 1, j);
count += dfs(i + 1, j);
count += dfs(i, j - 1);
count += dfs(i, j + 1);
// 返回局域网的总大小
return count;
}
int main() {
// 读取矩阵的行数和列数
scanf("%d %d", &n, &m);
// 读取服务器矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &server[i][j]);
visited[i][j] = false; // 初始化访问状态为未访问
}
}
int ans = 0; // 存储最大局域网的大小
// 遍历每个位置,使用DFS寻找最大的局域网
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
// 只有在当前位置有服务器且未访问过时才进行DFS搜索
if (server[i][j] == 1 && !visited[i][j]) {
int currentNetworkSize = dfs(i, j);
if (currentNetworkSize > ans) {
ans = currentNetworkSize; // 更新最大局域网的大小
}
}
}
}
// 输出最大局域网包含的服务器个数
printf("%d\n", ans);
return 0;
}
完整用例
用例1
2 2
1 0
1 1
用例2
3 3
1 0 1
0 1 0
1 0 1
用例3
4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1
用例4
5 5
1 0 0 1 0
0 1 1 0 1
0 1 1 0 1
1 0 0 1 0
0 1 1 0 1
用例5
3 4
1 0 1 1
0 1 1 0
1 0 0 1
用例6
10 10
1 0 0 1 0 0 0 0 0 0
0 1 1 0 1 0 1 1 1 0
0 1 1 0 1 0 1 1 1 0
1 0 0 1 0 0 0 0 0 0
0 1 1 0 1 0 1 1 1 0
0 1 1 0 1 0 1 1 1 0
1 0 0 1 0 0 0 0 0 0
0 1 1 0 1 0 1 1 1 0
0 1 1 0 1 0 1 1 1 0
1 0 0 1 0 0 0 0 0 0
用例7
6 8
1 0 0 1 0 0 0 0
0 1 1 0 1 0 1 1
0 1 1 0 1 0 1 1
1 0 0 1 0 0 0 0
0 1 1 0 1 0 1 1
1 1 1 0 1 0 1 1
用例8
7 7
1 0 0 1 0 0 0
0 1 1 0 1 0 1
0 1 1 0 1 0 1
1 0 0 1 0 0 0
0 1 1 0 1 0 1
1 1 1 0 1 0 1
1 1 1 0 1 0 1
用例9
4 5
1 0 0 1 0
0 1 1 0 1
0 1 1 0 1
1 0 0 1 0
用例10
5 4
1 0 1 1
0 1 1 0
1 0 0 1
0 1 1 0
1 0 0 1
@[TOC]