牛客竞赛 1018 翻转游戏

题意

给定一个矩形 , 每次点击一个方块会反转周围5个方块 , 求能否经过反转达到给出的情况

思路

调试了很久很久...
第一个wa : 在for循环嵌套时 , 把一个外部的写到内部了

第二个wa : 忘记v中存储的是char类型了 , 直接做了异或运算
第三个wa : 忘记更新pre的值了
第四个wa : 理解错误. 并不是只有下方的01和上方01影响 , 左右侧的01也会有影响
第五个wa : 弄反了pre和v[j-i][x] , 实际上是pre是按下按钮 , pre才会影响到左右侧的
第六个wa : 实际上 , 当确定了最左侧是否被按下后 , 右侧按钮也受到了左侧影响 , 当然输出时检测也要改变
第七个wa : 发现自己想假了 , 某个位置考虑时还会受到上面情况的影响
...

代码

#include<bits/stdc++.h>
using namespace std;

inline int read() {
    int ans = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')f = -1;
        ch = getchar();
    }
    while (ch <= '9' && ch >= '0') {
        ans = ans * 10 + ch - '0';
        ch = getchar();
    }
    return ans * f;
}
int n,m;
char g[15][105];
int gg[15][105];
int main() {
    n=read(),m=read();
    for (int i = 1; i<= n; i++) {
        for (int j = 1; j<=m;j++) {
            scanf("%c",&g[i][j]);
            g[i][j] = g[i][j]=='0'?0:1;
        }
        getchar();
    }
    bool f=false;
    for (int i =0 ;i< 1<<n; i++) {
        for (int a=1;a<=n;a++) {
            for (int b=1;b<=m;b++) {
                gg[a][b] = g[a][b];
            }
        }
        int pre[12] = {0},now[12] = {0};
        for (int j = 1; j<=n; j++)
            pre[j] = i>>j-1&1;
        for (int j=1;j<=n; j++) {
            gg[j][1] ^= pre[j-1] ^pre[j]^pre[j+1];
        }
        for (int j=2;j<=m;j++) {
            for (int k =1; k<=n; k++) {
                now[k] = gg[k][j-1];
            }
            for (int k= 1; k<= n; k++) {
                gg[k][j] ^= now[k-1]^now[k]^now[k+1]^pre[k];
            }
            for (int k= 1; k<= n; k++) {
                pre[k] = now[k];
            }
        }

        bool fg = true;
        for (int j=1;j<=n;j++) {
            if (gg[j][m]==0)continue;
            fg=false;
            break;
        }
        if (fg) {
            f = true;
            break;
        }
    }
    if (f)cout<<"YES\n";
    else cout<<"NO\n";
    return 0;
}
posted @ 2025-06-19 14:27  Guaninf  阅读(10)  评论(0)    收藏  举报