php 最优路径算法,使用栈解决迷宫问题(不是最优路径)php

/*

*迷宫数组

*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("没有路径可走");

}

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值