题目描述:
由空地和墙组成的迷宫中有一个球。球可以向上下左右四个方向滚动,但在遇到墙壁前不会停止滚动。当球停下时,可以选择下一个方向。
给定球的起始位置,目的地和迷宫,判断球能否在目的地停下。
迷宫由一个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;