/*
*迷宫数组
*1表示墙
*0表示路
*/
$arr = array(
array(1,1,1,1,1,1,1,1,1,1),
array(1,0,0,1,0,0,0,1,0,1),
array(1,0,0,1,0,0,0,1,0,1),
array(1,0,0,0,0,1,1,0,0,1),
array(1,0,1,1,1,0,0,0,0,1),
array(1,0,0,0,1,0,0,0,0,1),
array(1,0,1,0,0,0,1,0,0,1),
array(1,0,1,0,0,0,1,1,0,1),
array(1,1,0,0,0,0,0,0,0,1),
array(1,1,1,1,1,1,1,1,1,1),
);
//调用函数
mgpath(1,1,8,8);
/*
*迷宫算法函数
*使用堆栈思想,其实就是回溯法
*/
function mgpath($x1,$y1,$x2,$y2){
/*
*每一步对象
*/
class block{
//横坐标
public $i;
//纵坐标
public $j;
//下一个可走方块的方位号
public $di;
}
$st = array();
global $arr;
//初始化栈顶
$top = -1;
/*
*设置起点坐标
*/
$top++;
$st[$top] = new block;
$st[$top]->i = $x1;
$st[$top]->j = $y1;
$st[$top]->di = -1;
$arr[$x1][$y1] = -1;
/*
*回溯堆栈
*栈不为空时循环
*/
while($top > -1){
$i = $st[$top]->i;
$j = $st[$top]->j;
$di = $st[$top]->di;
/*
*找到出口,输出路径
*/
if($i == $x2 && $j = $y2){
print('迷宫路径如下:
');
for($k = 0; $k <= $top; $k++){
printf("(%d,%d)",$st[$k]->i,$st[$k]->j);
if(($k+1)%5==0) print("
");//每输出5个方块后换一行
}
return;//找到一条路径后结束
}
$find = 0;
while($di < 4 && $find==0){
$di++;
switch($di){
case 0:$i = $st[$top]->i - 1; $j = $st[$top]->j; break;
case 1:$i = $st[$top]->i; $j = $st[$top]->j + 1; break;
case 2:$i = $st[$top]->i + 1; $j = $st[$top]->j; break;
case 3:$i = $st[$top]->i; $j = $st[$top]->j - 1; break;
}
if($arr[$i][$j] == 0) $find = 1;
}
if($find == 1){ //找到下一个可走的方块
$st[$top]->di = $di; //修改栈顶元素的di值
$top++;//下一个可走方块进栈
$st[$top] = new block;
$st[$top]->i = $i;
$st[$top]->j = $j;
$st[$top]->di = -1;
$arr[$i][$j] = -1;//避免重复走到该方块
}else{
$arr[$st[$top]->i][$st[$top]->j] = 0; //没有路径可走,则退栈
$top--;
}
}
print("没有路径可走");
}
?>