题解:CF1983B Corner Twist
GreenMelon · · 题解
思路参考了 @Special_Tony 大佬。
根据题意,我们可以模拟一下:
假设有一个
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
现在,任意一行或任意一列的总和都是
然后选择一个
1 2 0 0 0
2 1 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
可以发现,现在任意一行或任意一列的总和模
得出一个规律:修改后的数组和原数组的任意一行或任意一列的总和模
根据这个规律一个一个模拟:如果两个数组的同一行或同一列的总和模 NO。
注意两个数字之间没有空格,所以先用 -'0' 转换成
#include<bits/stdc++.h>
using namespace std;
char a[505][505];
char b[505][505];
int main(){
int t;
cin>>t;
while(t--){
int n, m;
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>b[i][j];
}
}
bool is=1;
for(int i=0;i<n;i++){
int x=0, y=0;
for(int j=0;j<m;j++){
x+=a[i][j]-'0', y+=b[i][j]-'0';
}
if(x%3!=y%3) is=0;
}
for(int i=0;i<m;i++){
int x=0, y=0;
for(int j=0;j<n;j++){
x+=a[j][i]-'0', y+=b[j][i]-'0';
}
if(x%3!=y%3) is=0;
}
if(!is) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
}