1. 程式人生 > >code#5 P3 我有矩陣,你有嗎?

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;
}