您的位置:首页 > 其它

迷宫问题

2016-04-05 16:28 267 查看
迷宫问题,一般的解题思路是回溯法,也就是探步穷举,每走一步之前,先试探上下左右,直到出口.

这里用递归求解:

上下左右四个方向分别用 1,2,3,4 来标志

1 置访问标志为1,试探上下左右,如果有可走的,走下一步,没有则回溯

2 下一步,又试探上下左右,重新回到步骤1

3 直到出口

function DFS($visit, $m, $i, $j, $endi, $endj)
{

if ($visit[$i][$j] == 1) {
return false;
} else {
$visit[$i][$j] = 1;
}
if ($i == $endi && $j == $endj) {
return true;
}
if ($m[$i][$j] == 1) {
return false;
} else {
$res1 = DFS($visit, $m, $i - 1, $j, $endi, $endj);//上
$res2 = DFS($visit, $m, $i + 1, $j, $endi, $endj);//下
$res3 = DFS($visit, $m, $i, $j - 1, $endi, $endj);//左
$res4 = DFS($visit, $m, $i, $j + 1, $endi, $endj);//右
if ($res1) echo '(' . ($i - 1) . ',' . $j . ')';
if ($res2) echo '(' . ($i + 1) . ',' . $j . ')';
if ($res3) echo '(' . ($i) . ',' . ($j - 1) . ')';
if ($res4) echo '(' . ($i) . ',' . ($j + 1) . ')';
}

return true;

}

function lost()
{
$m[0] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
$m[1] = [1, 0, 1, 1, 1, 1, 1, 1, 1, 1];
$m[2] = [1, 0, 0, 1, 1, 1, 1, 1, 1, 1];
$m[3] = [1, 1, 0, 1, 1, 1, 1, 1, 1, 1];
$m[4] = [1, 1, 0, 1, 1, 1, 1, 1, 1, 1];
$m[5] = [1, 1, 0, 1, 1, 1, 0, 0, 0, 1];
$m[6] = [1, 1, 0, 1, 1, 1, 0, 1, 0, 1];
$m[7] = [1, 1, 0, 1, 1, 1, 0, 1, 0, 1];
$m[8] = [1, 1, 0, 0, 0, 0, 0, 1, 0, 1];
$m[9] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
$visit = [];

DFS($visit, $m, 1, 1, 8, 8);

}

lost();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: