BC #67 / hdu5601 N*M bulbs · 思维 黑白棋盘染色

题解

题意:熊孩子从左上角走到右下角,随便走,要求走到右下角的同时灯全灭

帖官方题解:
我们发现操作数跟n+m-1同奇偶,那是不是当1的个数跟n+m-1同奇偶是就是YES呢?
答案是肯定的,我们这样看:首先将棋盘黑白染色,就是若(i,j)格子,若(i+j)是奇数,那么就是黑格子,否则就是白格子。
我们发现我们可以通过一种操作使得从一个格子走到斜方向的任意一个格子。
这个操作很简单,我们假设一个2∗2的棋盘:
1 2
3 4
我们这样走:1->2->1->2->4, 1就直接走到4了,而且不产生任何操作。
也就是同色格子可以互相到达。

然后我们发现如果要操作一个开关,那么最后所在格子颜色一定会改变。
同上面这个例子:
1 2
3 4
假设我们要操作2这个格子。
1->2->1->3
我们成功操作了2这个格子,但是从白格子转到黑格子了。

也就是说
假设格子(n,m)下面有个格子(n+1,m)是最后终点,然而每次操作一个格子需要改变一次颜色。
也就是我们从(1,1)改变了若干次颜色后,最后颜色一定要和(n+1,m)相同。
也就是说1的个数要和(n+1+m)同奇偶。
也就是说1的个数要和(n+m-1)同奇偶。
否则无解。

其实感觉还是有点玄学,
结合下面某个大佬的博客的来瞧瞧,
在这里插入图片描述
从左上角到右下角,所有1都改变成0的次数,要和n+m-1的奇偶性保持一致


在这里插入图片描述


#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int a[N][N];
int n,m,k;

int main(){
    ios::sync_with_stdio(0);

    int T;
    cin>>T;
    for (int cs = 1; cs <= T; ++cs) {

        cin>>n>>m;
        int cnt=n+m-1;
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                cin>>a[i][j];
                cnt+=a[i][j];
            }
        }
        if(cnt&1)puts("NO");//不同
        else puts("YES");//相同
    }

    return 0;
}
发布了34 篇原创文章 · 获赞 0 · 访问量 950

猜你喜欢

转载自blog.csdn.net/Yubing792289314/article/details/104226571
nm
67