317. Shortest Distance from All Buildings
class Solution(object):
def shortestDistance(self, grid):
row, col = len(grid), len(grid[0])
distance = [[0] * col for _ in range(row)]
direction = [0, 1, 0, -1, 0]
BUILDING = 1
OBSTACLE = 2
EMPTY_LAND = 0
min_dist = float("inf")
for r in range(row):
for c in range(col):
if grid[r][c] == BUILDING:
que = deque()
que.append((r, c, 0))
local_min = float("inf")
while que:
i, j, dist = que.popleft()
for x in range(4):
newr, newc = i + direction[x], j + direction[x + 1]
if (newr < 0 or newc < 0 or newr >= row or newc >= col or grid[newr][newc] != EMPTY_LAND):
continue
grid[newr][newc] -= 1
que.append((newr, newc, dist + 1))
distance[newr][newc] += dist + 1
local_min = min(local_min, distance[newr][newc])
EMPTY_LAND -= 1
min_dist = local_min
return min_dist if min_dist != float("inf") else -1