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;
}