或|:同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;
}