矩阵转换(思维)

矩阵转换(思维)

题目描述

冬冬获得两个大小为n行m列的矩阵A和B,每个矩阵仅包含0和1。冬冬可以对矩阵A进行任意次数以下的操作:
取矩阵A的任何具有至少两行和两列的子矩阵,并反转其四个角上的值(即0变成1,1变成0)。
冬冬想知道A是否能转换成B。

输入

测试包含多组数据,第一行输入一个正整数t(3≤t≤10)表示测试数据的组数。
接下每每组测试数据的输入如下:
第一行输入两下正整数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; 
}
发布了259 篇原创文章 · 获赞 2 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/dy416524/article/details/105733962