矩阵转换(思维)
题目描述
冬冬获得两个大小为n行m列的矩阵A和B,每个矩阵仅包含0和1。冬冬可以对矩阵A进行任意次数以下的操作:
取矩阵A的任何具有至少两行和两列的子矩阵,并反转其四个角上的值(即0变成1,1变成0)。
冬冬想知道A是否能转换成B。
取矩阵A的任何具有至少两行和两列的子矩阵,并反转其四个角上的值(即0变成1,1变成0)。
冬冬想知道A是否能转换成B。
输入
测试包含多组数据,第一行输入一个正整数t(3≤t≤10)表示测试数据的组数。
接下每每组测试数据的输入如下:
第一行输入两下正整数n,m(2≤n,m≤500),表示矩阵的行数和列数。
接下来输入2*n行每行m个0或1,中间无空格。
接下每每组测试数据的输入如下:
第一行输入两下正整数n,m(2≤n,m≤500),表示矩阵的行数和列数。
接下来输入2*n行每行m个0或1,中间无空格。
输出
对于每组测试数据,如果能实现A转到B则输出Yes否则输出No。
样例输入 Copy
3
3 3
010
010
100
100
100
100
3 4
0101
1010
0101
1111
1111
1111
6 7
0011001
0100101
0001001
1010100
0100101
0101001
1101011
0110100
1101001
1010010
0110100
0111101
样例输出 Copy
Yes
No
Yes
提示
对于50%的数据,2≤n,m≤10,3≤t≤10。
对于100%的数据,2≤n,m≤500,3≤t≤10。
思路:可以发现,变化1次,每一行每一列只变两个,所以无论怎么改变,每一行每一列不同的个数必须是偶数。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
#define rep(i , a , b) for(register int i=(a);i<=(b);i++)
#define per(i , a , b) for(register int i=(a);i>=(b);i--)
#define ms(s) memset(s, 0, sizeof(s))
#define squ(x) (x)*(x)
#define first fi
#define second se
#define iterator iter
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int , int> pi;
typedef unordered_map<int,int> un_map;
typedef priority_queue<int> prque;
template<class T>
inline void read (T &x) {
x = 0;
int sign = 1;
char c = getchar ();
while (c < '0' || c > '9') {
if ( c == '-' ) sign = - 1;
c = getchar ();
}
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar ();
}
x = x * sign;
}
const int maxn = 3e5 + 10;
const int inf = 1e9;
const ll INF = ll(1e18);
const int mod = 998244353;
const double PI = acos(-1);
//#define LOCAL
int n,m;
char mat1[555][555];
char mat2[555][555];
void solve() {
rep(i,1,n) {
scanf("%s",mat1[i]+1);
}
rep(i,1,n) {
scanf("%s",mat2[i]+1);
}
int f=0;
rep(i,1,n) {
int cnt =0;
rep(j,1,m) {
if(mat1[i][j]!=mat2[i][j]) {
cnt++;
}
}
if(cnt%2) {
f=1;
break;
}
}
if(f) {
puts("No");
return;
}
rep(j,1,m) {
int cnt =0;
rep(i,1,n) {
if(mat1[i][j]!=mat2[i][j]) {
cnt++;
}
}
if(cnt%2) {
f=1;
break;
}
}
if(f) {
puts("No");
return;
}
puts("Yes");
}
int main(int argc, char * argv[])
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int t;
read(t);
while(t--) {
read(n);read(m);
solve();
}
return 0;
}