题解:CF1983B Corner Twist

· · 题解

思路参考了 @Special_Tony 大佬。

根据题意,我们可以模拟一下:

假设有一个 5\times 5 的二维数组 a,每个数字都为 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 0

现在,任意一行或任意一列的总和都是 0。

然后选择一个 2\times2 的子矩形,完成操作后的矩阵:

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

可以发现,现在任意一行或任意一列的总和模 3 还是 0。

得出一个规律:修改后的数组和原数组的任意一行或任意一列的总和模 3 是永远相同的。

根据这个规律一个一个模拟:如果两个数组的同一行或同一列的总和模 3 不相同,就可以直接输出 NO。

注意两个数字之间没有空格,所以先用 \texttt{char} 读取数组,在操作时再 -'0' 转换成 \texttt{int}。

#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;
    }
}