[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:

  1. There is only one ball and one destination in the maze.
  2. Both the ball and the destination exist on an empty space, and they will not be at the same position initially.
  3. 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.
  4. 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 }

 

flood fill题型总结

LeetCode 题目总结

posted @ 2020-07-28 02:06  CNoodle  阅读(332)  评论(0编辑  收藏  举报