由空地和墙组成的迷宫中有一个球。球可以向上下左右四个方向滚动,但在遇到墙壁前不会停止滚动。当球停下时,可以选择下一个方向。
给定球的起始位置,目的地和迷宫,判断球能否在目的地停下。
迷宫由一个0和1的二维数组表示。 1表示墙壁,0表示空地。你可以假定迷宫的边缘都是墙壁。起始位置和目的地的坐标通过行号和列号给出。
示例 1:
输入 1: 迷宫由以下二维数组表示 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 输入 2: 起始位置坐标 (rowStart, colStart) = (0, 4) 输入 3: 目的地坐标 (rowDest, colDest) = (4, 4) 输出: true 解析: 一个可能的路径是 : 左 -> 下 -> 左 -> 下 -> 右 -> 下 -> 右。
示例 2:
输入 1: 迷宫由以下二维数组表示 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 输入 2: 起始位置坐标 (rowStart, colStart) = (0, 4) 输入 3: 目的地坐标 (rowDest, colDest) = (3, 2) 输出: false 解析: 没有能够使球停在目的地的路径。
注意:
- 迷宫中只有一个球和一个目的地。
- 球和目的地都在空地上,且初始时它们不在同一位置。
- 给定的迷宫不包括边界 (如图中的红色矩形), 但你可以假设迷宫的边缘都是墙壁。
- 迷宫至少包括2块空地,行数和列数均不超过100。
深度优先搜索或广度优先搜索实现。
深度优先搜索。
class Solution:
def hasPath(self, maze: List[List[int]], start: List[int], destination: List[int]) -> bool:
def dfs(maze, start, destination):
if visited[start[0]][start[1]]:
return False
if start[0] == destination[0] and start[1] == destination[1]:
return True
visited[start[0]][start[1]] = True
l, r, u, d = start[1] - 1, start[1] + 1, start[0] - 1, start[0] + 1
while l >= 0 and maze[start[0]][l] == 0:
l -= 1
if dfs(maze, [start[0], l + 1], destination):
return True
while r < len(maze[0]) and maze[start[0]][r] == 0:
r += 1
if dfs(maze, [start[0], r - 1], destination):
return True
while u >= 0 and maze[u][start[1]] == 0:
u -= 1
if dfs(maze, [u + 1, start[1]], destination):
return True
while d < len(maze) and maze[d][start[1]] == 0:
d += 1
if dfs(maze, [d - 1, start[1]], destination):
return True
return False
visited = [[False for _ in maze[0]] for _ in maze]
return dfs(maze, start, destination)
class Solution {
private boolean[][] visited;
public boolean hasPath(int[][] maze, int[] start, int[] destination) {
int m = maze.length, n = maze[0].length;
visited = new boolean[m][n];
return dfs(maze, start, destination);
}
private boolean dfs(int[][] maze, int[] start, int[] destination) {
if (visited[start[0]][start[1]]) return false;
if (start[0] == destination[0] && start[1] == destination[1]) return true;
visited[start[0]][start[1]] = true;
int l = start[1] - 1, r = start[1] + 1, u = start[0] - 1, d = start[0] + 1;
while (l >= 0 && maze[start[0]][l] == 0) --l;
if (dfs(maze, new int[]{start[0], l + 1}, destination)) return true;
while (r < maze[0].length && maze[start[0]][r] == 0) ++r;
if (dfs(maze, new int[]{start[0], r - 1}, destination)) return true;
while (u >= 0 && maze[u][start[1]] == 0) --u;
if (dfs(maze, new int[]{u + 1, start[1]}, destination)) return true;
while (d < maze.length && maze[d][start[1]] == 0) ++d;
if (dfs(maze, new int[]{d - 1, start[1]}, destination)) return true;
return false;
}
}