Facebook面试题:目的地的最短路径
描述
给定表示地图上坐标的2D数组,地图上只有值0,1,2。0表示可以通过,1表示不可通过,2表示目标位置。从坐标[0,0]开始,你只能上,下,左,右移动。找到可以到达目的地的最短路径,并返回路径的长度。
- 地图一定存在且不为空,并且只存在一个目的地
- 保证targetMap[0][0]=0
样例1
输入:
[
[0, 0, 0],
[0, 0, 1],
[0, 0, 2]
]
输出: 4
说明: [0,0] -> [1,0] -> [2,0] -> [2,1] -> [2,2]
样例2
输入:
[
[0,1],
[0,1],
[0,0],
[0,2]
]
输出: 4
说明: [0,0] -> [1,0] -> [2,0] -> [3,0] -> [3,1]
解题思路
使用单向宽度优先搜索算法
源代码
from collections import deque
DIRECTIONS = [
(1, 0),
(0, -1),
(-1, 0),
(0, 1),
]
class Solution:
"""
@param targetMap:
@return: nothing
"""
def shortestPath(self, targetMap):
queue = deque([(0, 0)])
distance = {(0, 0): 0}
while queue:
x, y = queue.popleft()
for delta_x, delta_y in DIRECTIONS:
_x = x + delta_x
_y = y + delta_y
if not self.is_valid(_x, _y, targetMap, distance):
continue
queue.append((_x, _y))
distance[(_x, _y)] = distance[(x, y)] + 1
if targetMap[_x][_y] == 2:
return distance[(_x, _y)]
return -1
def is_valid(self, x, y, targetMap, distance):
if not 0 <= x < len(targetMap) or not 0 <= y < len(targetMap[0]):
return False
return targetMap[x][y] != 1 and (x, y) not in distance