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.
我也不知道题解是怎么做的,反正我是胡搞搞出来的
#include <map>
#include <set>
#include <list>
#include <stack>
#include <queue>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int m, n;
int matb[105][105];
int mat[105][105];
int c[105][105];
int main()
{
while(~scanf("%d%d", &m, &n))
{
int ans1 = 0;
memset (matb, 0, sizeof(matb));
memset (c, 0,sizeof(c));
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
scanf("%d", &mat[i][j]);
matb[i][j] = mat[i][j];
if (mat[i][j] == 1)
{
ans1++;
}
else
{
c[i][j] = 1;
}
}
}
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (c[i][j] == 1)
{
for (int x = 1; x <= m; x++)
{
if (matb[x][j])
{
matb[x][j] = 0;
}
}
for (int y = 1; y <= n; y++)
{
if (matb[i][y])
{
matb[i][y] = 0;
}
}
}
}
}
bool flag = false;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
int c = 0;
for (int x = 1; x <= m; x++)
{
c |= matb[x][j];
}
for (int y = 1; y <= n; y++)
{
c |= matb[i][y];
}
if (c != mat[i][j])
{
flag = true;
break;
}
}
if (flag)
{
break;
}
}
if (flag)
{
printf("NO\n");
continue;
}
printf("YES\n");
for (int i = 1; i <= m; i++)
{
for (int j = 1; j < n; j++)
{
printf("%d ",matb[i][j]);
}
printf("%d\n", matb[i][n]);
}
}
return 0;
}