Boolean Matrix Problem |
Given a boolean matrix mat[M][N] of size M X N, modify it such that if a matrix cell mat[i][j] is 1 (or true) then make all the cells of ith row and jth column as 1.
Example:
Input:
3
2 2
1 0
0 0
2 3
0 0 0
0 0 1
4 3
1 0 0
1 0 0
1 0 0
0 0 0
Output:
1 1
1 0
0 0 1
1 1 1
1 1 1
1 1 1
1 0 0
Here is a simple and easy solution using queue and hashing.
#include <bits/stdc++.h> using namespace std; int main() { //code int t; cin >> t; while (t--) { int n, m; cin >> n >> m; int a[n][m]; int b[n], c[m]; memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); queue < int > ql, qr; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> a[i][j]; if (a[i][j] == 1) { if (b[i] == 0) { qr.push(i); b[i] = 1;
//for eleminating duplicate col number } if (c[j] == 0) { ql.push(j); c[j] = 1;
//for eleminating duplicate col number } } } } while (!ql.empty()) { int i = ql.front(); // cout<<i<<" "; ql.pop(); for (int k = 0; k < n; ++k) { if (a[k][i] != 1) a[k][i] = 1; } } // cout<<endl; while (!qr.empty()) { int i = qr.front(); qr.pop(); //cout<<i<<" "; for (int k = 0; k < m; ++k) { if (a[i][k] != 1) a[i][k] = 1; } } // cout<<endl; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cout << a[i][j] << " "; } cout << endl; } } return 0; }