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

  • 相关阅读:
    页面返回顶部的方法总结
    举个栗子学习JavaScript设计模式
    深入理解css3中nth-child和 nth-of-type的区别
    HTML5笔记2——HTML5音/视频标签详解
    Chrome DevTools – 键盘和UI快捷键参考
    js中this关键字测试集锦
    JavaScript学习总结(三)——this、原型、javascript面向对象
    javascript移动设备Web开发中对touch事件的封装实例
    手机兼容集锦
    谈谈常用清除浮动的方法
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13388815.html
Copyright © 2011-2022 走看看