1 solutions

  • 0
    @ 2025-5-28 19:16:11

    数据范围特别小,所以直接打暴力即可

    #include <iostream>
    #include <vector>
    #include <functional>
    using namespace std;
    
    #define int long long
    
    int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
    
    void solve() {
        int n, m, k;
        cin >> n >> m >> k;
        vector<vector<int>> g(n + 1, vector<int>(m + 1));
        for (int i = 0; i < k; i++) {
            int x, y;
            cin >> x >> y;
            g[x][y] = 1;
        }
        int res = 0, ans = 0;
        function<void(int, int)> dfs = [&](int x, int y) {
            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i], ny = y + dy[i];
                int nnx = nx + dx[i], nny = ny + dy[i];
                if (nx <= 0 || ny <= 0 || nx > n || ny > m) continue;
                if (nnx <= 0 || nny <= 0 || nnx > n || nny > m) continue;
                if (g[nx][ny] == 1 && g[nnx][nny] == 0) {
                    g[x][y] = 0;
                    g[nx][ny] = 0;
                    g[nnx][nny] = 1;
                    res++;
                    ans = max(ans, res);
                    for (int ii = 1; ii <= n; ii++)
                        for (int jj = 1; jj <= m; jj++)
                            if (g[ii][jj] == 1) dfs(ii, jj);
                    g[x][y] = 1;
                    g[nx][ny] = 1;
                    g[nnx][nny] = 0;
                    res--;
                }
            }
        };
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                if (g[i][j] == 1) dfs(i, j);
        cout << k - ans << '\n';
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin.tie(0), cout.tie(0);
        int t;
        cin >> t;
        while (t--) solve();
    }
    
    • 1

    Information

    ID
    1491
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    7
    Tags
    (None)
    # Submissions
    70
    Accepted
    15
    Uploaded By