cf C题

题意:矩阵只包含0,1两种数字,给你一个矩阵A,另一个矩阵B,每一次可以从A中选出一个子矩阵,点击一次使得这个子矩阵的四个角的数字变成与原来相反的数,0变1,1变0。问你可不可以经过有限次的变换把矩阵A变成矩阵B。

思路:可以重新定义一个矩阵,矩阵A,B某位置元素相同,则记为0,不同记为1.则现在你的工作就是把这个新矩阵中数字为1的位置变为0.而点击一片大的区域使其四个角的数字变化,等价于直接点击四个角的数字。每个数字为1的数字都当点击一次,因为点击两次相当于没有变。所以要使得所有为1数字都变为0,只需要点击一次,就可。如果把所有数字为1的位置点击一次后,矩阵当中还有不为0的数字则,则这些多出来的1是点击原来的1新生成的,如果在去点击这些为1的数字那么原来从1变为0的数字又会全部变成1.这样就永远也不可能把所有为1的数字变成0了,陷入了一个无限循环的过程中。所以我们只需要检测点击一次过后,矩阵当中还有没有为1的数字,如果有则输出NO,反之输出YES.

下面上代码

#include<bits/stdc++.h>
using namespace std;
int main(void){
    int n,m;
    scanf("%d%d",&n,&m);
    int a[n][m],b[n][m],v[n][m];
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            scanf("%d",&a[i][j]);
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++){
            scanf("%d",&b[i][j]);
            v[i][j]=((a[i][j]!=b[i][j])?1:0);
        }
    for(int i=0;i<n-1;i++)
        for(int j=0;j<m-1;j++){
        if(v[i][j]){
            v[i][j]=v[i][j]^1;
            v[i+1][j]=v[i+1][j]^1;
            v[i][j+1]=v[i][j+1]^1;
            v[i+1][j+1]=v[i+1][j+1]^1;
        }
    }
    int ok=1;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            if(v[i][j]==1) ok=0;
    ok?printf("Yes"):printf("No");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/rainyskywx/p/10663592.html