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