zoukankan      html  css  js  c++  java
  • [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 题目总结

  • 相关阅读:
    sqlserver数据导入问题:报错“对COM组件的调用返回了错误HRESULT E_FAIL”
    删除文件夹提示”该项目不在请确认该项目位置“
    delphi三层DCOM架构
    sqlserver 将店铺表转换成可以用in查询的字符串
    Delphi如何获取一个字符串再另一个字符串中最后一次出现的位置
    c# 通过地址下载流然后保存文件到本地
    使用SQL语句清空数据库所有表的数据
    SqlServer 查询的时候过滤条件有参数导致速度很慢的问题-参数嗅探
    delphi和C# 保存exe文件到数据库
    DELPHI 多线程(TThread类的实现)
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13388815.html
Copyright © 2011-2022 走看看