OR in Matrix
Let's define logical OR as an operation on two logical values (i. e. values that belong to the set {0, 1}) that is equal to 1 if either or both of the logical values is set to 1, otherwise it is 0. We can define logical OR of three or more logical values in the same manner:
where is equal to 1 if some ai = 1, otherwise it is equal to 0.
Nam has a matrix A consisting of m rows and n columns. The rows are numbered from 1 to m, columns are numbered from 1 to n. Element at row i (1 ≤ i ≤ m) and column j (1 ≤ j ≤ n) is denoted as Aij. All elements of A are either 0 or 1. From matrix A, Nam creates another matrix B of the same size using formula:
.
(Bij is OR of all elements in row i and column j of matrix A)
Nam gives you matrix B and challenges you to guess matrix A. Although Nam is smart, he could probably make a mistake while calculating matrix B, since size of A can be large.
The first line contains two integer m and n (1 ≤ m, n ≤ 100), number of rows and number of columns of matrices respectively.
The next m lines each contain n integers separated by spaces describing rows of matrix B (each element of B is either 0 or 1).
In the first line, print "NO" if Nam has made a mistake when calculating B, otherwise print "YES". If the first line is "YES", then also print m rows consisting of n integers representing matrix A that can produce given matrix B. If there are several solutions print any one.
2 2 1 0 0 0
NO
2 3 1 1 1 1 1 1
YES 1 1 1 1 1 1
2 3 0 1 0 1 1 1
YES 0 0 0 0 1 0矩阵A通过OR运算变成矩阵B,现给出矩阵B,问能不能求出矩阵A,若有多组,输出任意一组矩阵A
OR运算 : A[i][j] 表示矩阵A第i行第j列的所有数中包含1,则B[i][j]就是1,否则就是0
通过B矩阵反求A矩阵
#include<cstdio>
#include<cstring>
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define mt(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long LL;
const int maxn = 1e2+20;
int pos[maxn][maxn], put[maxn][maxn];
int main(){
int m, n, ans, flag;
scanf("%d%d", &m, &n);
mt(pos, 0); mt(put, 0);//memset只能初始化0,-1,0x3f3f3f3f这三个值,所以只能绕个圈子标记
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
scanf("%d", &pos[i][j]);
if(pos[i][j] == 0){//B矩阵一个值为0,则A矩阵这个值行与列都不可能出现1
for(int k = 0; k < m; k++){
put[k][j] = 1;//用1标记0,即矩阵A不可能出现1的位置,最后1,0颠倒输出即可
}
for(int k = 0; k < n; k++){
put[i][k] = 1;
}
}
}
}
ans = 1;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){//所有不可能出现1的位置已标记
if(pos[i][j] == 1){//判断所有B矩阵是1的位置,判断该行与列是否可以出现1
flag = 0;
for(int k = 0; k < m; k++){
if(put[k][j] == 0){
flag = 1;
break;
}
}
if(flag) continue;
for(int k = 0; k < n; k++){
if(put[i][k] == 0){
flag = 1;
break;
}
}
if(flag) continue;
ans = 0;
break;
}
}
}
if(ans){
printf("YES\n");
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
printf("%d%c", !put[i][j], j == n-1 ? '\n' : ' ');//1,0反着输出
}
}
}
else{
printf("NO\n");
}
return 0;
}