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()
🙏整理題解不易, 如果有幫助到您,請給點個贊 ???? 和收藏 ?,讓更多的人看到。🙏🙏🙏