Grid Illumination

update Mar 5 2019, 19:08

LeetCodearrow-up-right

On a N x N grid of cells, each cell (x, y) with 0 <= x < N and 0 <= y < N has a lamp.

Initially, some number of lamps are on. lamps[i] tells us the location of the i-th lamp that is on. Each lamp that is on illuminates every square on its x-axis, y-axis, and both diagonals (similar to a Queen in chess).

For the i-th query queries[i] = (x, y), the answer to the query is 1 if the cell (x, y) is illuminated, else 0.

After each query (x, y) [in the order given by queries], we turn off any lamps that are at cell (x, y) or are adjacent 8-directionally (ie., share a corner or edge with cell (x, y).)

Return an array of answers. Each value answer[i] should be equal to the answer of the i-th query queries[i].

Example 1:

Input: N = 5, lamps = [[0,0],[4,4]], queries = [[1,1],[1,0]]
Output: [1,0]

Explanation: 

Before performing the first query we have both lamps [0,0] and [4,4] on.
The grid representing which cells are lit looks like this, where [0,0] is the top left corner, and [4,4] is the bottom right corner:
1 1 1 1 1
1 1 0 0 1
1 0 1 0 1
1 0 0 1 1
1 1 1 1 1
Then the query at [1, 1] returns 1 because the cell is lit.  After this query, the lamp at [0, 0] turns off, and the grid now looks like this:
1 0 0 0 1
0 1 0 0 1
0 0 1 0 1
0 0 0 1 1
1 1 1 1 1
Before performing the second query we have only the lamp [4,4] on.  Now the query at [1,0] returns 0, because the cell is no longer lit.

Note:

  1. 1 <= N <= 10^9

  2. 0 <= lamps.length <= 20000

  3. 0 <= queries.length <= 20000

  4. lamps[i].length == queries[i].length == 2

Basic Idea:

题意是说给定一个pair数组 lamps 和一个pair数组 queries,以及一个整数 N。N 表示整个grid的边长,lamps表示亮灯的坐标。灯笼可以照亮横竖以及两个对角线。query也是坐标,返回该点是否亮,但query完成之后需要关掉以它为中心的九个格子的灯笼。

需要注意的是这道题目所给的 N 的范围很大,所以我们不可以真的建这么大的grid,而是需要用map来存row, col 以及两个对角线。然后先根据lamps更新这四个map,再在处理quries的时候将lamp去掉,同时更新map。

技巧:

对于对角线,我们也可以用一个点点坐标来唯一标示:对于点(x,y),其所在点从左下到右上的对角线可以表示为 x+y, 从左上到右下到对角线可以表示为 x-y

Python Code:

Java Code:

Last updated