代码改变世界

[LeetCode] 490. 迷宫 PHP版

2021-03-19 15:37  折翼的鸟  阅读(61)  评论(0编辑  收藏  举报

题目描述:

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

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

迷宫由一个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 "\n";
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 "\r";
78     printMaze($steps);
79 }
80 walk($maze, [0, 0], [count($maze) - 1, count($maze[0]) - 1]);
81 exit;