5 条题解

  • 0
    @ 2026-5-2 8:10:16
    #include <bits/stdc++.h>
    #define LL long long
    using namespace std;
    const int N = 1010;
    int n, m;
    char g[N][N];
    int dx[4] = {-1, 1, 0, 0};
    int dy[4] = {0, 0, -1, 1};
    
    bool f(int x, int y) {
        if (g[x][y] != '.') return false;
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i], ny = y + dy[i];
            if (nx < 1 || nx > n || ny < 1 || ny > m) continue;
            if (g[nx][ny] == '#') return false;
        }
        return true;
    }
    
    int add(int x0, int y0) {
        if (g[x0][y0] != '#') return 0;
        int res = 0;
        bool self_ok = true;
        for (int i = 0; i < 4; i++) {
            int nx = x0 + dx[i], ny = y0 + dy[i];
            if (nx < 1 || nx > n || ny < 1 || ny > m) continue;
            if (g[nx][ny] == '#') {
                self_ok = false;
                break;
            }
        }
        if (self_ok) res++;
        for (int i = 0; i < 4; i++) {
            int nx = x0 + dx[i], ny = y0 + dy[i];
            if (nx < 1 || nx > n || ny < 1 || ny > m) continue;
            if (g[nx][ny] != '.') continue;
            bool origin_bad = false;
            for (int j = 0; j < 4; j++) {
                int nnx = nx + dx[j], nny = ny + dy[j];
                if (nnx < 1 || nnx > n || nny < 1 || nny > m) continue;
                if (g[nnx][nny] == '#' && (nnx != x0 || nny != y0)) {
                    origin_bad = true;
                    break;
                }
            }
            if (!origin_bad && !f(nx, ny)) {
                res++;
            }
        }
        return res;
    }
    
    int main() {
        cin >> n >> m;
        for (int i = 1; i <= n; i++) {
            string s; cin >> s;
            for (int j = 1; j <= m; j++) {
                g[i][j] = s[j-1];
            }
        }
        int base = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (f(i, j)) base++;
            }
        }
        int max_add = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (g[i][j] == '#') {
                    max_add = max(max_add, add(i, j));
                }
            }
        }
        cout << base + max_add << endl;
        return 0;
    }
    //:)
    //114514
    

    信息

    ID
    3314
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    121
    已通过
    23
    上传者