2014年11月12日 星期三

Codeforces Round #277 Div2 pB OR in Matrix

這題頗有趣
首先設定一種對矩陣的操作:
a'_ij = a_i1 OR a_i2 OR ...... a_1j OR a_2j ....
然後給你A' 問,存不存在一個A,使的A操作後便A'。
有的話要輸出解(一個就好)

主要就是考察每一格是否可以放1(假如該格的行和列都是1,那就是可以)然後盡可能的放。

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#include<utility>
#include<map>
#include<set>
#include<queue>
#include<cmath>
using namespace std;
typedef long long int int64;
int main()
{
    int n, m ; scanf("%d %d", &n, &m);
    int build[101][101] = {0};
    int mat[101][101];
    int vis[101][101] = {0};
    for(int lx = 0;lx < n;lx++){
        for(int ly = 0;ly < m;ly++)
            scanf("%d", &mat[lx][ly]);
    }

    for(int lx = 0;lx < n;lx++){
        for(int ly = 0;ly < m;ly++){
            if(mat[lx][ly] == 0) continue;
            //if(vis[lx][ly] == 1) continue;
            bool check1 = true, check2 = true;
            for(int la = 0;la < n;la++)
                check1 = check1 and mat[la][ly] == 1;
            for(int lb = 0;lb < m;lb++)
                check2 = check2 and mat[lx][lb] == 1;
            if(check1 and check2){
                for(int la = 0;la < n;la++)
                    vis[la][ly] = 1;
                for(int lb = 0;lb < m;lb++)
                    vis[lx][lb] = 1;
                build[lx][ly] = 1;
            }
        }
    }
    int count = 0;
    for(int lx = 0;lx < n;lx++)
        for(int ly = 0;ly < m;ly++)
            if(mat[lx][ly] and vis[lx][ly] == 0)
                count++;
    if(count){
        puts("NO");
    }else{
        puts("YES");
        for(int lx = 0;lx < n;lx++){
            for(int ly = 0;ly < m;ly++)
                printf("%d ", build[lx][ly]);
            printf("\n");
        }
    }
    return 0;
}

沒有留言:

張貼留言