cf C题

时间:2023-12-21 23:51:44

题意:矩阵只包含0,1两种数字,给你一个矩阵A,另一个矩阵B,每一次可以从A中选出一个子矩阵,点击一次使得这个子矩阵的四个角的数字变成与原来相反的数,0变1,1变0。问你可不可以经过有限次的变换把矩阵A变成矩阵B。

思路:可以重新定义一个矩阵,矩阵A,B某位置元素相同,则记为0,不同记为1.则现在你的工作就是把这个新矩阵中数字为1的位置变为0.而点击一片大的区域使其四个角的数字变化,等价于直接点击四个角的数字。每个数字为1的数字都当点击一次,因为点击两次相当于没有变。所以要使得所有为1数字都变为0,只需要点击一次,就可。如果把所有数字为1的位置点击一次后,矩阵当中还有不为0的数字则,则这些多出来的1是点击原来的1新生成的,如果在去点击这些为1的数字那么原来从1变为0的数字又会全部变成1.这样就永远也不可能把所有为1的数字变成0了,陷入了一个无限循环的过程中。所以我们只需要检测点击一次过后,矩阵当中还有没有为1的数字,如果有则输出NO,反之输出YES.

下面上代码

#include<bits/stdc++.h>
using namespace std;
int main(void){
int n,m;
scanf("%d%d",&n,&m);
int a[n][m],b[n][m],v[n][m];
for(int i=;i<n;i++)
for(int j=;j<m;j++)
scanf("%d",&a[i][j]);
for(int i=;i<n;i++)
for(int j=;j<m;j++){
scanf("%d",&b[i][j]);
v[i][j]=((a[i][j]!=b[i][j])?:);
}
for(int i=;i<n-;i++)
for(int j=;j<m-;j++){
if(v[i][j]){
v[i][j]=v[i][j]^;
v[i+][j]=v[i+][j]^;
v[i][j+]=v[i][j+]^;
v[i+][j+]=v[i+][j+]^;
}
}
int ok=;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
if(v[i][j]==) ok=;
ok?printf("Yes"):printf("No");
return ;
}