cf C题
Posted rainyskywx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf C题相关的知识,希望对你有一定的参考价值。
题意:矩阵只包含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=0;i<n;i++) for(int j=0;j<m;j++) scanf("%d",&a[i][j]); for(int i=0;i<n;i++) for(int j=0;j<m;j++){ scanf("%d",&b[i][j]); v[i][j]=((a[i][j]!=b[i][j])?1:0); } for(int i=0;i<n-1;i++) for(int j=0;j<m-1;j++){ if(v[i][j]){ v[i][j]=v[i][j]^1; v[i+1][j]=v[i+1][j]^1; v[i][j+1]=v[i][j+1]^1; v[i+1][j+1]=v[i+1][j+1]^1; } } int ok=1; for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(v[i][j]==1) ok=0; ok?printf("Yes"):printf("No"); return 0; }
以上是关于cf C题的主要内容,如果未能解决你的问题,请参考以下文章