Codeforces 1475F - Unusual Matrix

Codeforces 1475F - Unusual Matrix

题目概述

给定两个方阵$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);
// scanf("%s",empt+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;
}