zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Scale-Invariant Error
    Regularizing Deep Networks with Semantic Data Augmentation
    BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition
    2021.5.17
    2021.5.14
    2021.5.13
    2021.5.12
    2021.5.8
    2021.5.7 团队冲刺第十天
    2021.5.6 团队冲刺第九天
  • 原文地址:https://www.cnblogs.com/rainyskywx/p/10663592.html
Copyright © 2011-2022 走看看