题目链接:http://codeforces.com/contest/486/problem/B

题目大意:

  有两个矩阵A和B,矩阵B的元素Bij的值是所有A的第i行元素和第j列元素或运算后的值。现在给出B矩阵,求A矩阵。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

分析:

  首先,如果B[i][j] == 1,那么B矩阵或者第i行全为1,或者第j列全为1;如果B[i][j] == 0,那么A矩阵第i行全为0且第j列也全为0。   其次,如果A[i][j] == 1,那么B矩阵第i行全为1且第j列也全为1。以此可以推出B矩阵全为1的行和全为1的列要么全有,要么全没有。   于是可以把B矩阵全为1的行和全为1的列找出来一一配对,交点位置对应的A矩阵位置置1。

代码如下:

CodeForces 486B OR in Matrix 随笔 第1张
  1 #include <bits/stdc++.h>
  2 using namespace std;
  3  
  4 #define rep(i,n) for (int i = 0; i < (n); ++i)
  5 #define For(i,s,t) for (int i = (s); i <= (t); ++i)
  6 #define rFor(i,t,s) for (int i = (t); i >= (s); --i)
  7 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
  8 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)
  9  
 10 #define pr(x) cout << #x << " = " << x << "  "
 11 #define prln(x) cout << #x << " = " << x << endl
 12  
 13 #define LOWBIT(x) ((x)&(-x))
 14  
 15 #define ALL(x) x.begin(),x.end()
 16 #define INS(x) inserter(x,x.begin())
 17  
 18 #define ms0(a) memset(a,0,sizeof(a))
 19 #define msI(a) memset(a,inf,sizeof(a))
 20 #define msM(a) memset(a,-1,sizeof(a))
 21  
 22 #define pii pair<int,int> 
 23 #define piii pair<pair<int,int>,int> 
 24 #define mp make_pair
 25 #define pb push_back
 26 #define fi first
 27 #define se second
 28  
 29 inline int gc(){
 30     static const int BUF = 1e7;
 31     static char buf[BUF], *bg = buf + BUF, *ed = bg;
 32      
 33     if(bg == ed) fread(bg = buf, 1, BUF, stdin);
 34     return *bg++;
 35 } 
 36  
 37 inline int ri(){
 38     int x = 0, f = 1, c = gc();
 39     for(; c<48||c>57; f = c=='-'?-1:f, c=gc());
 40     for(; c>47&&c<58; x = x*10 + c - 48, c=gc());
 41     return x*f;
 42 }
 43  
 44 typedef long long LL;
 45 typedef unsigned long long uLL;
 46 const int inf = 1e9 + 9;
 47 const LL mod = 1e9 + 7;
 48 const int maxN = 1e2 + 7;
 49  
 50 int n, m;
 51 int A[maxN][maxN];
 52 // Brow[i]表示第i行所有数与运算的值 
 53 // Bcol[i]表示第i列所有数与运算的值 
 54 // AllBrow表示所有Brow[i]或运算的值 
 55 // AllBcol表示所有Bcol[i]或运算的值 
 56 int B[maxN][maxN], Brow[maxN], AllBrow, Bcol[maxN], AllBcol;
 57 bool ans;
 58  
 59 int main(){
 60     while(cin >> n >> m) {
 61         ms0(A);
 62         rep(i, n) rep(j, m) cin >> B[i][j];
 63          
 64         AllBrow = AllBcol = 0; 
 65         rep(i, n) {
 66             Brow[i] = 1;
 67             rep(j, m) Brow[i] &= B[i][j];
 68             AllBrow |= Brow[i];
 69         }
 70         rep(i, m) {
 71             Bcol[i] = 1;
 72             rep(j, n) Bcol[i] &= B[j][i];
 73             AllBcol |= Bcol[i];
 74         }
 75          
 76         ans = !(AllBrow ^ AllBcol);
 77          
 78         rep(i, n) rep(j, m) {
 79             if(B[i][j] == 1 && Brow[i] == 0 && Bcol[j] == 0) {
 80                 ans = false;
 81                 i = n;
 82                 break;
 83             }
 84         }
 85          
 86         if(ans) {
 87             rep(i, n) rep(j, m) {
 88                 if(Brow[i] & Bcol[j]) {
 89                     A[i][j] = 1;
 90                 }
 91             }
 92              
 93             cout << "YES" << endl;
 94             rep(i, n) {
 95                 rep(j, m) {
 96                     cout << A[i][j] << " ";
 97                 }
 98                 cout << endl;
 99             }
100         }
101         else cout << "NO" << endl;
102     }
103     return 0;
104 }
View Code

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄