Python中的网格照明

假设我们有一个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]