CF1475F. 异常矩阵

CF1475F. 异常矩阵

原题链接

描述

有两个 0-1 矩阵 a,b,存在两种操作:

1、选择一列,将这列的元素 Xor 1。

2、选择一行,将这行的元素 Xor 1。

判断是否存在操作使得矩阵 a 能转化为矩阵 b。

思路

由异或的性质,我们可以得到两点结论。

1、操作的顺序不影响结果。

2、操作最多只能进行一次。

根据这两点,我们可以根据第一行判断每一列是否要进行操作1,之后根据第一列判断每一行是否要进行操作2,最后判断两个矩阵是否相等。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=1010;
int a[N][N],b[N][N],n;
void opt(int x,int i){
    if(x==1){
        for(int j=0;j<n;j++) a[j][i]^=1;
    }else
        for(int j=0;j<n;j++) a[i][j]^=1;
}
int main(){
    int t; cin>>t; while(t--){
        cin>>n;
        for(int i=0;i<n;i++){
            string aa; cin>>aa;
            for(int j=0;j<aa.size();j++){
                a[i][j]=aa[j]-'0';
            }
        }
        for(int i=0;i<n;i++){
            string aa; cin>>aa;
            for(int j=0;j<aa.size();j++){
                b[i][j]=aa[j]-'0';
            }
        }
        for(int i=0;i<n;i++){
            if(a[0][i]!=b[0][i]) opt(1,i);
        }
        for(int j=1;j<n;j++){
            if(a[j][0]!=b[j][0]) opt(2,j);
        }
        bool flag=true;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(a[i][j]!=b[i][j]){flag=false; break;}
            }
        }
        if(flag) puts("YES"); else puts("NO");
    }
    return 0;
}
posted @ 2021-01-26 21:14  ans20xx  阅读(58)  评论(0编辑  收藏  举报