[LeetCode] 490. The Maze
There is a ball in a maze
with empty spaces (represented as 0
) and walls (represented as 1
). The ball can go through the empty spaces by rolling up, down, left or right, but it won't stop rolling until hitting a wall. When the ball stops, it could choose the next direction.
Given the m x n
maze
, the ball's start
position and the destination
, where start = [startrow, startcol]
and destination = [destinationrow, destinationcol]
, return true
if the ball can stop at the destination, otherwise return false
.
You may assume that the borders of the maze are all walls (see examples).
Example 1:
Input 1: a maze represented by a 2D array 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 Input 2: start coordinate (rowStart, colStart) = (0, 4) Input 3: destination coordinate (rowDest, colDest) = (4, 4) Output: true Explanation: One possible way is : left -> down -> left -> down -> right -> down -> right.
Example 2:
Input 1: a maze represented by a 2D array 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 Input 2: start coordinate (rowStart, colStart) = (0, 4) Input 3: destination coordinate (rowDest, colDest) = (3, 2) Output: false Explanation: There is no way for the ball to stop at the destination.
Note:
- There is only one ball and one destination in the maze.
- Both the ball and the destination exist on an empty space, and they will not be at the same position initially.
- The given maze does not contain border (like the red rectangle in the example pictures), but you could assume the border of the maze are all walls.
- The maze contains at least 2 empty spaces, and both the width and height of the maze won't exceed 100.
迷宫。
由空地(用 0 表示)和墙(用 1 表示)组成的迷宫 maze 中有一个球。球可以途经空地向 上、下、左、右 四个方向滚动,且在遇到墙壁前不会停止滚动。当球停下时,可以选择向下一个方向滚动。
给你一个大小为 m x n 的迷宫 maze ,以及球的初始位置 start 和目的地 destination ,其中 start = [startrow, startcol] 且 destination = [destinationrow, destinationcol] 。请你判断球能否在目的地停下:如果可以,返回 true ;否则,返回 false 。你可以 假定迷宫的边缘都是墙壁(参考示例)。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/the-maze
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题意是给一个二维矩阵,里面有一个球和一个目标点,同时矩阵里面有障碍物。球移动的规则是遇到墙才会停止,停下了才有机会转向。求这个球是否有机会停在目标点。
这道题还是比较常规的flood fill类型的题目。但是这个题跟一般的flood fill的题有区别的一点是球只有在遇到障碍物的时候才会停下来,所以在做BFS遍历的时候,条件是在不越界的情况下,在同一个方向上只有遇到边界或者障碍物才停下,否则横坐标和纵坐标可以一直移动。
时间O(mn)
空间O(n)
Java实现
1 class Solution { 2 public boolean hasPath(int[][] maze, int[] start, int[] destination) { 3 boolean[][] visited = new boolean[maze.length][maze[0].length]; 4 int[][] dirs = { { 0, 1 }, { 0, -1 }, { -1, 0 }, { 1, 0 } }; 5 Queue<int[]> queue = new LinkedList<>(); 6 queue.add(start); 7 visited[start[0]][start[1]] = true; 8 while (!queue.isEmpty()) { 9 int[] s = queue.poll(); 10 if (s[0] == destination[0] && s[1] == destination[1]) { 11 return true; 12 } 13 for (int[] dir : dirs) { 14 int x = s[0] + dir[0]; 15 int y = s[1] + dir[1]; 16 while (x >= 0 && y >= 0 && x < maze.length && y < maze[0].length && maze[x][y] == 0) { 17 x += dir[0]; 18 y += dir[1]; 19 } 20 if (!visited[x - dir[0]][y - dir[1]]) { 21 queue.add(new int[] { x - dir[0], y - dir[1] }); 22 visited[x - dir[0]][y - dir[1]] = true; 23 } 24 } 25 } 26 return false; 27 } 28 }