zoukankan      html  css  js  c++  java
  • [LeetCode] 490. 迷宫 PHP版

    题目描述:

    由空地和墙组成的迷宫中有一个球。球可以向上下左右四个方向滚动,但在遇到墙壁前不会停止滚动。当球停下时,可以选择下一个方向。

    给定球的起始位置,目的地和迷宫,判断球能否在目的地停下。

    迷宫由一个0和1的二维数组表示。 1表示墙壁,0表示空地。你可以假定迷宫的边缘都是墙壁。起始位置和目的地的坐标通过行号和列号给出。

    示例:

    示例 1:

    输入 1: 迷宫由以下二维数组表示
    
    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
    
    输入 2: 起始位置坐标 (rowStart, colStart) = (0, 4)
    输入 3: 目的地坐标 (rowDest, colDest) = (4, 4)
    
    输出: true
    
    解析: 一个可能的路径是 : 左 -> 下 -> 左 -> 下 -> 右 -> 下 -> 右。

     

     1 $maze = [
     2     [0, 1, 0, 0, 0],
     3     [0, 0, 0, 1, 0],
     4     [0, 1, 0, 1, 0],
     5     [1, 1, 1, 0, 0],
     6     [0, 1, 0, 0, 1],
     7     [0, 1, 0, 0, 0]
     8 ];
     9 
    10 
    11 function printMaze($maze){
    12     for ($i = 0; $i < count($maze); $i++) { 
    13         for ($j = 0; $j < count($maze[$i]); $j++) { 
    14             echo $maze[$i][$j]." ";
    15         }
    16         echo "
    ";
    17     }
    18 }
    19 
    20 
    21 function walk($maze, $start, $end){
    22     printMaze($maze);
    23     // 复制下迷宫, 全部为0, 记录走过的路线
    24     $steps = [];
    25     for ($i = 0; $i < count($maze); $i++) { 
    26         for ($j = 0; $j < count($maze[$i]); $j++) { 
    27             $steps[$i][$j] = 0;
    28         }
    29     }
    30     // printMaze($steps);
    31 
    32     // 上左下右
    33     $dirs = [[-1, 0], [0, -1], [1, 0], [0,1]];
    34 
    35     $queue[] = $start;
    36     $k = 1;
    37     while (!empty($queue)) {
    38         $cur = array_pop($queue);
    39 
    40         // 等于出口,提前结束
    41         if($cur[0] == $end[0] && $cur[1] == $end[1]){
    42             break;
    43         }
    44 
    45         for ($z = 0; $z < count($dirs); $z++) { 
    46             $i = $cur[0] + $dirs[$z][0];
    47             $j = $cur[1] + $dirs[$z][1];
    48 
    49             // 四个方向挨个相加, 判断有没有超出边界
    50             if($i < 0 || $i >= count($maze)){
    51                 continue;
    52             }
    53 
    54             if($j < 0 || $j >= count($maze[0])){
    55                 continue;
    56             }
    57 
    58             // 撞墙了就跳过
    59             if($maze[$i][$j] == 1){
    60                 continue;
    61             }
    62 
    63             // 走过了就不要走了
    64             if($steps[$i][$j] != 0){
    65                 continue;
    66             }
    67 
    68             if($i == $start[0] and $j == $start[1]){
    69                 continue;
    70             }
    71             // 走过的路线记录下
    72             $steps[$i][$j] = 2;
    73             // 把四个方向能走的 全部记录下来
    74             array_push($queue, [$i, $j]);
    75         }
    76     }
    77     echo "
    ";
    78     printMaze($steps);
    79 }
    80 walk($maze, [0, 0], [count($maze) - 1, count($maze[0]) - 1]);
    81 exit;

  • 相关阅读:
    FZU 2112 并查集、欧拉通路
    HDU 5686 斐波那契数列、Java求大数
    Codeforces 675C Money Transfers 思维题
    HDU 5687 字典树插入查找删除
    HDU 1532 最大流模板题
    HDU 5384 字典树、AC自动机
    山科第三届校赛总结
    HDU 2222 AC自动机模板题
    HDU 3911 线段树区间合并、异或取反操作
    CodeForces 615B Longtail Hedgehog
  • 原文地址:https://www.cnblogs.com/toxiaonan/p/14558138.html
Copyright © 2011-2022 走看看