1 条题解

  • 0
    @ 2026-1-31 22:42:27
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    // 定义全局数组,根据题目约束 n,m ≤ 100,开 105 避免越界
    const int MAX = 105;
    char grid[MAX][MAX];
    bool visited[MAX][MAX];
    int n, m;  // 全局存储地图的行数和列数
    
    // DFS 函数,仅传当前坐标,无需引用
    int dfs(int x, int y) {
        // 越界、已访问、不是污染海域则返回 0
        if (x < 0 || x >= n || y < 0 || y >= m || visited[x][y] || grid[x][y] != '*') {
            return 0;
        }
        visited[x][y] = true;
        int area = 1;
        // 遍历上下左右四个方向
        area += dfs(x - 1, y);
        area += dfs(x + 1, y);
        area += dfs(x, y - 1);
        area += dfs(x, y + 1);
        return area;
    }
    
    int main() {
        cin >> n >> m;
        // 初始化访问标记数组
        memset(visited, false, sizeof(visited));
    
        // 读取地图到全局数组
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cin >> grid[i][j];
            }
        }
    
        int count = 0;          // 污染海域的片数
        int total_area = 0;     // 污染总面积
        int max_area = 0;       // 最大污染面积
    
        // 遍历整个地图
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == '*' && !visited[i][j]) {
                    count++;
                    int area = dfs(i, j);
                    total_area += area;
                    if (area > max_area) {
                        max_area = area;
                    }
                }
            }
        }
    
        cout << count << " " << total_area << " " << max_area << endl;
    
        return 0;
    }
    
    • 1

    信息

    ID
    1291
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者