class Solution(object):
def shortestDistance(self, maze, start, destination):
des = tuple(destination)
r, c = len(maze), len(maze[0])
def go(x, y, dx, dy):
step = 0
while 0 <= x+dx < r and 0 <= y+dy < c and maze[x+dx][y+dy] == 0:
x += dx
y += dy
step += 1
return (x, y), step
heap = [(0, tuple(start))]
visited = {}
while heap:
distance, cur = heapq.heappop(heap)
if cur in visited and visited[cur] <= distance:
continue
if cur == des: return distance
visited[cur] = distance
for dx, dy in [(1, 0), (-1, 0), (0, 1), (0, -1)]:
nextCur, step = go(cur[0], cur[1], dx, dy)
heapq.heappush(heap, (distance+step, nextCur))
return -1