• [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 题目总结

  • 相关阅读:
    jquery 表单清空
    CK-Editor content.replace
    CSS DIV HOVER
    返回上一页并刷新与返回上一页不刷新代码
    Google Java编程风格指南中文版
    编程常见英语词汇
    教你如何删除tomcat服务器的stdout.log文件
    @Autowired @Resource @Qualifier的区别
    JSTL标签,EL表达式,OGNL表达式,struts2标签 汇总
    4.11 application未注入报错解决
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13388815.html
Copyright © 2020-2023  润新知