题目概述
给定两个方阵$a,b$,现在对$a$可以执行若干次整行对1异或,整列对1异或,问是否能够从$a$转化到$b$?
分析与解
其实还是那个必要条件,我们假设一个顺序。因为顺序与最终的值无关。先执行所有的整列异或,再执行整行异或。因此我们先看$a$中第一行和$b$中第一行,如果不一样,那么把$a$的对应列异或。再看$a$的第一列和$b$的第一列,如果不一样,把$a$的对应行异或。这样只要能得到$b$就是合法,否则非法。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include <bits/stdc++.h> int n; char a[1010][1010],b[1010][1010],empt; int main() { int kase; scanf("%d",&kase); bool flag; while(kase--) { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%s",a[i]+1);
for(int i=1;i<=n;i++)scanf("%s",b[i]+1); for(int i=1;i<=n;i++) if(a[1][i]!=b[1][i]) for(int j=1;j<=n;j++) if(a[j][i]=='1')a[j][i]='0'; else a[j][i]='1'; for(int i=1;i<=n;i++) if(a[i][1]!=b[i][1]) for(int j=1;j<=n;j++) if(a[i][j]=='1')a[i][j]='0'; else a[i][j]='1'; flag=true; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]!=b[i][j]) { flag=false; break; } flag==true ? printf("YES\n") : printf("NO\n"); } return 0; }
|