假设我们有一个N x N的单元格,在每个单元格(x,y)中都有一个灯。最初,某些灯点亮。这些灯[i]是第i个灯点亮的位置。每个点亮的灯在其x轴,y轴和两个对角线上的每个正方形均发光。现在,对于第i个查询,即querys [i] =(x,y),如果单元格(x,y)发光,则查询的答案为1,否则为0。在每个查询(x,y)之后,我们关闭位于单元格(x,y)或与8方向相邻的所有灯。返回答案数组。每个值answer [i]应该等于第i个查询query [i]的答案。
因此,如果输入为N = 5,则灯为[[0,0],[4,4]],查询= [[1,1],[1,0]],则输出为[1 ,0]
为了解决这个问题,我们将遵循以下步骤-
灯:=给定阵列灯的成对对
创建映射x,y,diag1,diag2
对于灯中的每对(i,j)
x [i]:= x [i] + 1,y [j]:= y [j] + 1
diag1 [i + j]:= diag1 [i + j] + 1,diag2 [i-j] = diag2 [i-j] + 1
回答:= []
对于C中的每个值
对于在b-1到b + 1范围内的col
x [行]:= x [行]-1
y [col]:= y [col]-1
diag1 [row + col] = diag1 [row + col]-1
diag2 [row-col] = diag2 [row-col]-1
从灯上移开
如果行,col对在灯中,则-
a:= i [0],b:= i [1]
插入(如果x [a] + y [b] + diag1 [a + b] + diag2 [a-b]> 0,否则为0,则插入1)到ans
适用于范围a-1至a + 1的行
返回ans
让我们看下面的实现以更好地理解-
from collections import defaultdict class Solution(object): def gridIllumination(self, N, b, C): lamps = {(i[0], i[1]) for i in b} x, y, diag1, diag2 = defaultdict(int), defaultdict(int), defaultdict(int), defaultdict(int) for i, j in lamps: x[i] += 1 y[j] += 1 diag1[i + j] += 1 diag2[i - j] += 1 ans = [] for i in C: a = i[0] b = i[1] ans.append(1 if x[a] + y[b] + diag1[a + b] + diag2[a - b] > 0 else 0) for row in range( a - 1, a + 2): for col in range(b - 1, b + 2): if (row, col) in lamps: x[row] -= 1 y[col] -= 1 diag1[row + col] -= 1 diag2[row - col] -= 1 lamps.remove((row, col)) return ans ob = Solution()N = 5 lamps = [[0,0],[4,4]] query = [[1,1],[1,0]] print(ob.gridIllumination(N, lamps, query))
5, [[0,0],[4,4]], [[1,1],[1,0]]
输出结果
[1, 0]