题目链接:http://codeforces.com/contest/1119/problem/C
题意:给两个同型的由0、1组成的矩阵A、B,问A能否经过指定的操作变成B,指定操作为在矩阵A中选定一个子矩阵(行数,列数均>=2),该子矩阵的四个角的值能翻转,即1->0,0->1。
思路:结论--只要A、B的所有行的值之和同奇偶,所有列的值之和同奇偶就输出Yes,否则输出No。证明:经过操作(1,1,x,y) (x>1,y>1)可将A中非第一行、第一列的元素变成和B一致,即Axy=Bxy。然后因为变化的过程每一行、每一列的奇偶不变,所以此时A、B的第一行、第一列的值自然也相等。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int n,m,rs[2][505],cs[2][505],tmp; 5 6 int main(){ 7 scanf("%d%d",&n,&m); 8 for(int i=0;i<2;++i) 9 for(int j=0;j<n;++j) 10 for(int k=0;k<m;++k){ 11 scanf("%d",&tmp); 12 rs[i][j]^=tmp; 13 cs[i][k]^=tmp; 14 } 15 int flag=1; 16 for(int i=0;i<n;++i) 17 if(rs[0][i]!=rs[1][i]){ 18 flag=0; 19 break; 20 } 21 if(flag){ 22 for(int i=0;i<m;++i) 23 if(cs[0][i]!=cs[1][i]){ 24 flag=0; 25 break; 26 } 27 } 28 if(flag) printf("Yes "); 29 else printf("No "); 30 return 0; 31 }