- Data Structure
- Networking
- RDBMS
- Operating System
- Java
- MS Excel
- iOS
- HTML
- CSS
- Android
- Python
- C Programming
- C++
- C#
- MongoDB
- MySQL
- Javascript
- PHP
- Physics
- Chemistry
- Biology
- Mathematics
- English
- Economics
- Psychology
- Social Studies
- Fashion Studies
- Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
C++ program to find sum of all cells lighten by the lamps
Suppose we have a grid with H rows and W columns. Where each square is tidy or untidy. We can place lamps on zero or more more tidy squares in this grid. A lamp can lighten the cells in each of the four directions - up, down, left, and right - to the point just before an edge of the grid or an untidy square is reached for the first time (the untidy cell will not be lighted). The lamp will also lighten the cell on which it is placed. In the grid if G[i, j] is '.' that cell is tidy and when it is '#' it is untidy. Let K be the number of tidy squares. There are 2^K ways to place the lamps in total. Assume that, for each of these 2^K ways, the number of cells lightened by one or more lamps is computed. We have to find the sum of those numbers modulo 10^9 + 7.
So, if the input is like
. | . | # |
# | . | . |
then the output will be 52
Steps
To solve this, we will follow these steps −
m := 10^9 + 7 N = 2003 Define 2D arrays u, l, r, d of order N x N, and another list p with N^2 elements. h := row count of matrix w := column count of matrix tidy := 0 p[0] := 1 for initialize i := 1, when i <= h * w, update (increase i by 1), do: p[i] := p[i - 1] * 2 mod m for initialize i := 0, when i < h, update (increase i by 1), do: for initialize j := 0, when j < w, update (increase j by 1), do: u[i, j] := i l[i, j] := j if i is non-zero, then: u[i, j] := u[i - 1, j] if j is non-zero, then: l[i, j] := l[i, j - 1] if matrix[i, j] is same as '#', then: u[i, j] := i + 1 l[i, j] := j + 1 Otherwise (increase tidy by 1) for initialize i := h - 1, when i >= 0, update (decrease i by 1), do: for initialize j := w - 1, when j >= 0, update (decrease j by 1), do: d[i, j] := i r[i, j] := j if i < h - 1, then: d[i, j] := d[i + 1, j] if j < w - 1, then: r[i, j] := r[i, j + 1] if matrix[i, j] is same as '#', then: d[i, j] := i - 1 r[i, j] := j - 1 cnt := 0 for initialize i := 0, when i < h, update (increase i by 1), do: for initialize j := 0, when j < w, update (increase j by 1), do: if matrix[i, j] is same as '#', then: Ignore following part, skip to the next iteration src := d[i, j] + r[i, j] - u[i, j] - l[i, j] + 1 cnt := (cnt + (p[src] - 1) * p[tidy - src]) mod m return cnt
Example
Let us see the following implementation to get better understanding −
#include <bits/stdc++.h> using namespace std; const int m = 1e9 + 7, N = 2003; int u[N][N], l[N][N], r[N][N], d[N][N], p[N * N]; int solve(vector<vector<char>> matrix){ int h = matrix.size(); int w = matrix[0].size(); int tidy = 0; p[0] = 1; for (int i = 1; i <= h * w; ++i) p[i] = p[i - 1] * 2 % m; for (int i = 0; i < h; ++i){ for (int j = 0; j < w; ++j){ u[i][j] = i; l[i][j] = j; if (i) u[i][j] = u[i - 1][j]; if (j) l[i][j] = l[i][j - 1]; if (matrix[i][j] == '#'){ u[i][j] = i + 1; l[i][j] = j + 1; } else ++tidy; } } for (int i = h - 1; i >= 0; --i){ for (int j = w - 1; j >= 0; --j){ d[i][j] = i; r[i][j] = j; if (i < h - 1) d[i][j] = d[i + 1][j]; if (j < w - 1) r[i][j] = r[i][j + 1]; if (matrix[i][j] == '#'){ d[i][j] = i - 1; r[i][j] = j - 1; } } } int cnt = 0; for (int i = 0; i < h; ++i){ for (int j = 0; j < w; ++j){ if (matrix[i][j] == '#') continue; int src = d[i][j] + r[i][j] - u[i][j] - l[i][j] + 1; cnt = (cnt + (p[src] - 1) * p[tidy - src]) % m; } } return cnt; } int main(){ vector<vector<char>> matrix = { { '.', '.', '#' }, { '#', '.', '.' } }; cout << solve(matrix) << endl; }
Input
3, 2, { 1, 5, 9 }, { 2, 4, 2 }
Output
52