操作是找到一个矩形,一条边全部加1,另一条边全部加2
由此可以发现,对于矩形的每一行来说都是加3,每一列也是加3,因为一个矩形只有2条对角线
所以,该矩形的每一行的总和和每一列的总和是不变的(mod 3)
根据该规律,我们依次去枚举行和列,看 a、b
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int T;
bool solve()
{
int n, m;
cin >> n >> m;
char a[510][510], b[510][510];
for (int i = 0; i < n; i ++ ) cin >> a[i];
for (int i = 0; i < n; i ++ ) cin >> b[i];
for (int i = 0; i < n; i ++ )
{
int ta = 0, tb = 0;
for (int j = 0; j < m; j ++ )
{
ta += a[i][j] - '0';
tb += b[i][j] - '0';
}
if (ta % 3 != tb % 3) return false;
}
for (int i = 0; i < m; i ++ )
{
int ta = 0, tb = 0;
for (int j = 0; j < n; j ++ )
{
ta += a[j][i] - '0';
tb += b[j][i] - '0';
}
if (ta % 3 != tb % 3) return false;
}
return true;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> T;
while (T -- )
{
if (solve()) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
矩阵每行或每列的总和 % 3是否相同