code#5 P3 我有矩陣,你有嗎?
阿新 • • 發佈:2018-11-03
我有矩陣,你有嗎?
時間限制: 1.0 秒
空間限制: 128 MB
相關檔案: 題目目錄
題目描述
企鵝豆豆手裡有兩個 01 矩陣 A 和 B。他可以進行兩種操作:
- 選擇 A 矩陣的一行,然後把這一行的 0 變成 1,把 1 變成 0。
- 選擇 A
現在他想知道能不能把 A 矩陣通過以上操作變成 B 矩陣。保證 A 矩陣和 B 矩陣的大小一致。
輸入格式
從標準輸入讀入資料。
每個測試點只有一組資料。
輸入的第一行包含兩個正整數 n 和 m,表示 A 矩陣的行數,保證 n≤103,m≤103。 接下來 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; }