B. OR in Matrix
2015-11-08 12:30
495 查看
B. OR in Matrixtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputLet'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:whereis equal to1 if some ai = 1, otherwise it is equal to0.Nam has a matrix A consisting ofm 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 matrixA, Nam creates another matrix B of the same size using formula:.(Bij isOR of all elements in rowi and column j of matrixA)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.InputThe 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 containn integers separated by spaces describing rows of matrixB (each element of B is either0 or 1).OutputIn 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 ofn integers representing matrix A that can produce given matrixB. If there are several solutions print any one.Sample test(s)Input
2 2 1 0 0 0Output
NOInput
2 3 1 1 1 1 1 1Output
YES 1 1 1 1 1 1Input
2 3 0 1 0 1 1 1Output
YES 0 0 0 0 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;}