Live2D

code#5 P3 我有矩阵,你有吗?

 

时间限制: 1.0 秒

空间限制: 128 MB

相关文件: 题目目录

题目描述

企鹅豆豆手里有两个 01 矩阵 A 和 B。他可以进行两种操作:

  1. 选择 A 矩阵的一行,然后把这一行的 0 变成 1,把 1 变成 0
  2. 选择 A 矩阵的一列,然后把这一列的 0 变成 1,把 1 变成 0

现在他想知道能不能把 A 矩阵通过以上操作变成 B 矩阵。保证 A 矩阵和 B 矩阵的大小一致。

输入格式

从标准输入读入数据。

每个测试点只有一组数据。

输入的第一行包含两个正整数 n 和 m,表示 A 矩阵的行数,保证 n103m103。 接下来 n 行,每行 m 个由空格隔开的整数,表示矩阵 A。保证矩阵中只有 0 或者 1。 接下来 n 行,每行 m 个由空格隔开的整数,表示矩阵 B。保证矩阵中只有 0 或者 1

输出格式

输出到标准输出。

如果矩阵 A 通过以上两种操作可以变成矩阵 B,输出 Koyi,否则输出 Budexing

思路:

在做这道题之前,建议大家先看一下

[SCOI2005]扫雷

这两道题在思路上有着相似之处

我们可以将01矩阵转化一下,生成一个新的矩阵

如果两个矩阵在该位置相同,那么新矩阵这个位置的值为1

否则为0

我们分别假定第一个位置被修改过,没有被修改过

分别跑一次

因为要求合法,所以当第一行状态被确定时,后面的状态就全部被确定了

暴力n*m地扫就行

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<queue>
#include<cstdlib>
#include<algorithm>
#define rii register int i
#define rij register int j
using namespace std;
int ys[1005][1005],mb[1005][1005],now[1005][1005],cs[1005][1005];
int m,n;
inline bool cs1()
{
    for(rii=1;i<=m;i++)
    {
        if(now[1][i]==1)
        {
            for(rij=1;j<=n;j++)
            {
                now[j][i]=(now[j][i]+1)%2;
            }
        }
    }
    for(rii=2;i<=n;i++)
    {
        int pd=now[i][1];
        for(rij=2;j<=m;j++)
        {
            if(now[i][j]!=pd)
            {
                return false;
            }
        }
    }
    return true;
}
inline bool cs2()
{
    for(rii=1;i<=m;i++)
    {
        if(now[1][i]==0)
        {
            for(rij=1;j<=n;j++)
            {
                now[j][i]=(now[j][i]+1)%2;
            }
        }
    }
    for(rii=2;i<=n;i++)
    {
        int pd=now[i][1];
        for(rij=2;j<=m;j++)
        {
            if(now[i][j]!=pd)
            {
                return false;
            }
        }
    }
    return true;
}
int main()
{
//    freopen("2.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(rii=1;i<=n;i++)
    {
        for(rij=1;j<=m;j++)
        {
            scanf("%d",&ys[i][j]);
        }
    }
    for(rii=1;i<=n;i++)
    {
        for(rij=1;j<=m;j++)
        {
            scanf("%d",&mb[i][j]);
        }
    }
    for(rii=1;i<=n;i++)
    {
        for(rij=1;j<=m;j++)
        {
            if(ys[i][j]!=mb[i][j])
            {
                now[i][j]=1;
                cs[i][j]=1;
            }
        }
    }
    if(cs1()==true)
    {
        puts("Koyi");
        return 0;
    }
    if(cs2()==true)
    {
        puts("Koyi");
        return 0;
    }
    puts("Budexing");
    return 0;
} 

 

posted @ 2018-11-03 20:35  ztz11  阅读(176)  评论(0编辑  收藏  举报