1 条题解

  • 0
    @ 2024-9-7 12:24:31

    枚举+递推

    由于按键的先后顺序对最后的结果并无影响,且重复按键只能做无用功,于是可以考虑对每个点按0/1次。通过枚举第一行的按键情况,可以使用二进制 [0,232)[0,2^{32}) 表示按键情况,依次对之后的所有0进行按键反转。

    #include <bits/stdc++.h>
    #include <cstring>
    using namespace std;
    const int N =6, inf = 0x3f3f3f3f;
    int t, n = 5, m, d[][2] = {0,0,-1, 0, 1, 0, 0, -1, 0, 1};
    char s[N][N],g[N][N];
    
    void turn(int x, int y) {
        for (int i = 0; i < 5; i++) {
            int a = x + d[i][0], b = y + d[i][1];
            if (a < 0 || a >= n || b < 0 || b >= n) continue;
            g[a][b] ^= 1;
        }
    }
    void solve1(){
        int ans = inf;
        for (int k = 0; k < 32; k++) {
            memcpy(g,s,sizeof s);
            int v = 0, tt = 0;
            for (int j = 0; j < 5; j++)
                if (k >> j & 1) turn(0, j), v++;
            for (int i = 1; i < 5; i++)
                for (int j = 0; j < 5; j++)
                    if (g[i-1][j]=='0') turn(i, j), v++;
            for (int j = 0; j < n; j++) tt+=g[4][j]-'0';
            if (v<=6 && tt==5) ans = min(ans, v);
        }
        cout << (ans == inf ? -1 : ans) << endl;
    }
    int main() {
        cin >> t;
        while (t--) {
            for (int i = 0; i < n; i++) cin >> s[i];
            solve1();
        }
    }
    
    • 1

    信息

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