原题
https://leetcode.com/problems/the-maze/
解法
DFS. 定义dfs函数, 返回球从(x, y)出发, 是否能停在目的地. 回溯的条件是如果(x,y) 等于目的地, 返回True.如果(x, y)是已经访问过的, 返回False. 我们将访问过的位置放入visited, 然后在上下左右四个方向检查, 让球一直滚, 检查停住的地方是否为目的地, 如果有一个是, 那么返回True, 如果遍历完了之后球不会停在目的地, 返回False.
Time: O(mn)
Space: O(mn)
代码
class Solution(object):
def hasPath(self, maze, start, destination):
"""
:type maze: List[List[int]]
:type start: List[int]
:type destination: List[int]
:rtype: bool
"""
def dfs(x, y):
# return if the ball can stop at destination if starting at (x, y)
if [x,y] == destination:
return True
if (x, y) in visited:
return False
visited.add((x, y))
for dx, dy in [(-1,0),(1,0),(0,-1),(0,1)]:
new_x, new_y = x, y
# the ball rolls until hitting a wall
while 0 <= new_x+dx < row and 0 <= new_y+dy < col and maze[new_x+dx][new_y+dy] == 0:
new_x += dx
new_y += dy
if dfs(new_x, new_y):
return True
return False
row, col = len(maze), len(maze[0])
visited = set()
return dfs(start[0], start[1])