Python中的网格照明
假设我们有一个NxN的单元格,在每个单元格(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]