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;

  • 相关阅读:
    Python异常处理
    Python序列化中json模块和pickle模块
    Python常用模块random/time/sys/os模块
    软件测试--读书笔记
    团队作业——系统设计和任务分配
    结对项目之需求分析与原型设计
    生成小学计算题(升级版)
    生成小学计算题
    软件工程基础
    第一个微信小项目
  • 原文地址:https://www.cnblogs.com/toxiaonan/p/14558138.html
Copyright © 2011-2022 走看看