[题解]CF1475F Unusual Matrix

题目大意:给定一个 nn01 矩阵,每次操作可以选择一行或者一列,整体 xor 1 ,求经过无限多次操作,能否变为目标矩阵

我们发现,每一行或每一列至多被操作一次,且如果某一列或某一列的操作确定,整个矩阵的操作就确定

所以枚举第一列是否被操作,获得整个矩阵的操作方法,再带回到矩阵中检验即可

代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for (register int i=(a);i<=(b);i++)
#define drep(i,a,b) for (register int i=(a);i>=(b);i--)
typedef long long ll;
using namespace std;
inline ll read()
{
	ll sum=0,f=0;char c=getchar();
	while (!isdigit(c)) f|=(c=='-'),c=getchar();
	while (isdigit(c)) sum=(sum<<1)+(sum<<3)+(c^48),c=getchar();
	return f?-sum:sum;
}

const int N=1010;
int n,a[N][N],h[N],w[N];
char c1[N][N],c2[N][N];

inline bool chk1()
{
	memset(h,0,sizeof(h)),memset(w,0,sizeof(w));
	h[1]=1;
	rep(i,1,n) if ((a[i][1]^h[1])==0) w[i]=0;else w[i]=1;
	rep(i,2,n) if ((a[1][i]^w[1])==0) h[i]=0;else h[i]=1;
	
	rep(i,1,n) rep(j,1,n) if ((a[i][j]^h[j]^w[i])==1) return false;
	return true;
}

inline bool chk2()
{
	memset(h,0,sizeof(h)),memset(w,0,sizeof(w));
	h[1]=0;
	rep(i,1,n) if ((a[i][1]^h[1])==0) w[i]=0;else w[i]=1;
	rep(i,2,n) if ((a[1][i]^w[1])==0) h[i]=0;else h[i]=1;
	
	rep(i,1,n) rep(j,1,n) if ((a[i][j]^h[j]^w[i])==1) return false;
	return true;
}

inline void solve()
{
	n=read();
	rep(i,1,n) scanf("%s",c1[i]+1);
	rep(i,1,n) scanf("%s",c2[i]+1);
	rep(i,1,n) rep(j,1,n) a[i][j]=c1[i][j]^c2[i][j];
	
	if (chk1()||chk2()) printf("YES\n");
	else printf("NO\n");
}

int main()
{
	drep(T,read(),1) solve();
}
posted @   ZSH_ZSH  阅读(70)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示