●问题描述:
给出一个矩阵,其中0表示通路,1表示墙壁,这样就形成了一个迷宫,要求编写算法求出其中路径。
●递归思路:
编写一个走迷宫函数,传入二位数组的下标,先假设该点位于最终路径上(将0置为3)再探测周围四个点是否可以走通(是否为0),如果可以走通则将该点四周能走通的点作为函数参数传入函数进入递归。若四周均不能走通(都不为0时)则将该点置回0表示该点不是最终路径上的点。
在此思路中递归进入时表示了枚举路径,当发现此条路径走到某处再不能走通时就将路径该点置回0并且递归退出(回溯)寻找下一条可走通路径。
●代码:
1 <?php 2 //深度优先遍历 3 $maze = array( 4 array(0,0,0,1), 5 array(0,1,0,1), 6 array(0,0,0,1), 7 array(1,1,0,0), 8 ); 9 10 function search($i, $j, $maze) 11 { 12 //下、右、上、左 13 $fx = array(1,0,-1,0); 14 $fy = array(0,1,0,-1); 15 for($k=0;$k<4;++$k) 16 { 17 $newx = $i + $fx[$k]; 18 $newy = $j + $fy[$k]; 19 20 //如果不是墙,且没有走过 21 if($newx>=0&&$newx<4&&$newy>=0&&$newy<4&&0==$maze[$newx][$newy]) 22 { 23 $maze[$newx][$newy] = 3; 24 if(3 == $newx && 3 == $newy) 25 { 26 show($maze); 27 $maze[$newx][$newy] = 0; 28 } else { 29 search($newx, $newy, $maze); 30 } 31 } 32 } 33 //回溯的时候将此点标记为未访问,这样下一个路径也可以访问 34 $maze[$i][$j] = 0; 35 } 36 37 show($maze); 38 $maze[0][0] = 3; 39 search(0, 0, $maze); 40 /** 41 * 打印迷宫 42 */ 43 function show($info) 44 { 45 foreach($info as $value) 46 { 47 foreach($value as $v) 48 { 49 echo $v . " " ; 50 } 51 echo "<br/>"; 52 } 53 echo "<br/><br/><hr/><br/><br/>"; 54 }