B. OR in Matrix
来源:互联网 发布:软件测试很难吗 编辑:程序博客网 时间:2024/05/29 03:42
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 to1, otherwise it is 0. We can define logicalOR of three or more logical values in the same manner:
where is equal to1 if some ai = 1, otherwise it is equal to0.
Nam has a matrix A consisting of m rows and n columns. The rows are numbered from1 to m, columns are numbered from1 to n. Element at rowi (1 ≤ i ≤ m) and columnj (1 ≤ j ≤ n) is denoted asAij. All elements ofA are either 0 or 1. From matrix A, Nam creates another matrix B of the same size using formula:
.
(Bij isOR of all elements in row i and column j of matrix A)
Nam gives you matrix B and challenges you to guess matrixA. Although Nam is smart, he could probably make a mistake while calculating matrixB, since size of A can be large.
The first line contains two integer m andn (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 either0 or 1).
In the first line, print "NO" if Nam has made a mistake when calculatingB, otherwise print "YES". If the first line is "YES", then also printm rows consisting of n integers representing matrix A that can produce given matrixB. If there are several solutions print any one.
2 21 00 0
NO
2 31 1 11 1 1
YES1 1 11 1 1
2 30 1 01 1 1
YES0 0 00 1 0
wa了几发才过、
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>#include <cstdlib>using namespace std;int a[110][110], b[110][110];int main() {memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));int m, n;cin >> m>> n;for (int i = 0; i<m; i++) {for (int j = 0; j<n; j++) {cin >> a[i][j];b[i][j] = 1;}}if (m == n && m == 1) {cout << "YES" << endl;cout << a[0][0] << endl;return 0;}int flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 1;for (int i = 0; i<m; i++) {for (int j = 0; j<n; j++) {if (a[i][j] == 1) {flag4 = 0;flag1 = 0, flag2 = 0;for (int k = 0; k<n; k++) {if (a[i][k] != 1)flag1 ++ ;}for (int k = 0; k<m; k++) {if (a[k][j] != 1)flag2 ++ ;}if (flag1 == 0 && flag2 == 0)flag3 ++ ;else if (flag1>0 && flag2>0) {cout << "NO"<< endl;return 0;}}}}if (flag4 == 1) {cout << "YES" << endl;for (int i = 0; i<m; i++) {for (int j = 0; j<n-1; j++) {cout << a[i][j] << " ";}cout << a[i][n-1] << endl;}cout << endl;return 0;}if (flag3 > 0) {cout << "YES"<< endl;for (int i = 0; i<m; i++) {for (int j = 0; j<n; j++) {if (a[i][j] == 0) {for (int k = 0; k<n; k++) b[i][k] = 0;for (int k = 0; k<m; k++)b[k][j] = 0;}}}for (int i = 0; i<m; i++) {for (int j = 0; j<n-1; j++) {cout << b[i][j] << " ";}cout << b[i][n-1] << endl;} cout << endl;}else {cout << "NO" << endl;}return 0;}