OD统一考试(C卷)
分值: 200分
题解: Java / Python / C++
题目描述
在一个机房中,服务器的位置标识在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;
}
Java
import java.util.Scanner;public class Main {public static int dfs(int[][] grid, int i, int j) {if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || 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;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int m = scanner.nextInt();int n = scanner.nextInt();int[][] grid = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {grid[i][j] = scanner.nextInt();}}int maxServers = 0;// 遍历整个矩阵for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (grid[i][j] == 1) {// 使用深度优先搜索统计每个局域网的服务器数量maxServers = Math.max(maxServers, dfs(grid, i, j));}}}System.out.println(maxServers);}
}
Python
def dfs(grid, i, j):if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] == 0:return 0# 标记当前服务器已访问grid[i][j] = 0cnt = 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 cntdef main():m, n = map(int, input().split())grid = [list(map(int, input().split())) for _ in range(m)]maxServers = 0# 遍历整个矩阵for i in range(m):for j in range(n):if grid[i][j] == 1:# 使用深度优先搜索统计每个局域网的服务器数量maxServers = max(maxServers, dfs(grid, i, j))print(maxServers)if __name__ == "__main__":main()
🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏