[LeetCode] 490. The Maze

There is a ball in a maze with empty spaces and walls. The ball can go through 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 ball's start position, the destination and the maze, determine whether the ball could stop at the destination.

The maze is represented by a binary 2D array. 1 means the wall and 0 means the empty space. You may assume that the borders of the maze are all walls. The start and destination coordinates are represented by row and column indexes.

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.

迷宫。题意是给一个二维矩阵,里面有一个球和一个目标点,同时矩阵里面有障碍物。球移动的规则是遇到墙才会停止,停下了才有机会转向。求这个球是否有机会停在目标点。

这道题还是比较常规的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 题目总结

原文地址:https://www.cnblogs.com/cnoodle/p/13388815.html