迷宫问题,一般的解题思路是回溯法,也就是探步穷举,每走一步之前,先试探上下左右,直到出口.
这里用递归求解:
上下左右四个方向分别用 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();