OR in Matrix CodeForces - 486B(或运算简单题)

或|:同0为0,其余为1
与&:同1为1,其余为0
异或^:同为1,异为0

题目细节参考链接: https://vjudge.net/problem/CodeForces-486B

思路:

给出B矩阵,用定义或运算推理A矩阵,Bij 为对矩阵 A 中 i 行 j 列 的所有逻辑值进行定义或运算后的值。
初始化A矩阵为真(memset初始化-1),0是比较好处理的,若 Bij 为0,则将A中第 i 行和第 j 列均设为0,然后其余仍为真,最后检验矩阵B的所有真值是否均能推出(只要 i 行 j 列中存在至少一个真值,则定义或运算结果必为真,就不证明了),若不能,则初始B矩阵是错误的;若能则直接输出A矩阵每个元素的相反数

核心代码:

int main() {//int T; cin >> T; getchar();

    int b[111][111], a[111][111];
    memset(a, -1, sizeof(a));
    int r, c, k;
    scanf("%d%d", &r, &c);
    for(int i = 0; i < r; i++)
        for(int j = 0; j < c; j++) {
            scanf("%d", &b[i][j]);
            if(!b[i][j]) {
                for(k = 0; k < c; k++)
                    a[i][k] = 0;
                for(k = 0; k < r; k++)
                    a[k][j] = 0;
            }
        }
    int ok = 1;
    for(int i = 0;ok && i < r; i++)
        for(int j = 0; j < c; j++) {
            if(b[i][j]) {
                for(k = 0; k < c; k++)
                    if(a[i][k]) break;
                if(k < c) continue;

                for(k = 0; k < r; k++)
                    if(a[k][j]) break;
                if(k == r) {ok = 0; break;}
            }
        }
    if(ok) {
        cout << "YES" << endl;
        for(int i = 0; i < r; i++)
            for(int j = 0; j < c; j++)
                printf("%d%c", -a[i][j], " \n"[j==c-1]);
    }
    else cout << "NO" << endl;
    return 0;
}
发布了54 篇原创文章 · 获赞 43 · 访问量 1943

猜你喜欢

转载自blog.csdn.net/Jungle_st/article/details/104710122