from collections import deque
DIRS = [(0, 1), (1, 0), (-1,0), (0, -1)]
class Solution:
def orangesRotting(self, grid: List[List[int]]) -> int:
d = deque()
visited = set()
count = 0
for i in range(len(grid)):
for j in range(len(grid[i])):
if grid[i][j] == 2:
visited.add((i, j))
d.append(((i, j), 0))
if grid[i][j] in (1, 2):
count += 1
maxc = None
while d:
(i, j), c = d.pop()
if maxc is None or c > maxc:
maxc = c
for (ix, jx) in DIRS:
ni, nj = i + ix, j + jx
if ni < 0 or nj < 0 or ni >= len(grid) or nj >= len(grid[ni]):
continue
if (ni, nj) in visited or grid[ni][nj] == 0:
continue
visited.add((ni, nj))
d.appendleft(((ni, nj), c + 1))
if len(visited) != count:
return -1
return maxc if maxc else 0