题解 | #迷宫问题#

迷宫问题

https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc

<?php
[$m, $n] = explode(' ', trim(fgets(STDIN)));

$arr = [];
for($i=0; $i<$m; $i++) {
    $arr[] = explode(' ', trim(fgets(STDIN)));
}

$routeArr = [[0, 0]];
$routeAllArr = [];
$arr[0][0] = 1;
$endX = $m-1;
$endY = $n-1;
// fds(0, 0, $m-1, $n-1, $arr, $routeArr, $routeAllArr);
fdsOne(0, 0, $endX, $endY, $arr, $routeArr);
echo '所有可能的路线:';
print_r($routeAllArr);
// print_r($routeArr);

/**
 * 找到一条路线就终止
 */
function fdsOne($x, $y, &$endX, &$endY, &$arr, &$routeArr) {
    // 如果当前点是终点,直接返回
    if ($endX == $x && $endY == $y) {
        foreach ($routeArr as $item) {
            echo "({$item[0]},$item[1])".PHP_EOL;
        }
        exit;
    }

    $dx = [0, 0, -1, 1];
    $dy = [1, -1, 0, 0];
    for ($i=0; $i<4; $i++) {
        $xTmp = $x + $dx[$i];
        $yTmp = $y + $dy[$i];
        // 只有终点刚好是边界点才能这样,如果不是则需要另外传边界点
        // if ($xTmp>=0 && $xTmp<=$endX && $yTmp>=0 && $yTmp<=$endY && 
        //     $arr[$xTmp][$yTmp] == 0
        // ) {
        //     $arr[$xTmp][$xTmp] = 1;
        //     $routeArr[] = [$xTmp, $yTmp];
        //     fdsOne($xTmp, $yTmp, $endX, $endY, $arr, $routeArr);
        //     array_pop($routeArr);
        //     $arr[$xTmp][$xTmp] = 0;
        // }
        // $memory = memory_get_peak_usage()/1024/1024;
        // echo '内存:'.$memory;
        if (isset($arr[$xTmp][$yTmp]) && $arr[$xTmp][$yTmp] == 0) {
            // echo "({$xTmp}, $yTmp)".PHP_EOL;
            $arr[$xTmp][$yTmp] = 1;
            $routeArr[] = [$xTmp, $yTmp];
            fdsOne($xTmp, $yTmp, $endX, $endY, $arr, $routeArr);
            array_pop($routeArr);
            $arr[$xTmp][$xTmp] = 0;
        }
    }
    return;
}

/**
 * 记录所有路线,最后遍历选择找到最短路线
 */
function fds($x, $y, $endX, $endY, &$arr, &$routeArr, &$routeAllArr) {
    // 如果当前点是终点,直接返回
    if ($endX == $x && $endY == $y) {
        $routeAllArr[] = $routeArr;
        return;
    }

    $dx = [0, 0, -1, 1];
    $dy = [1, -1, 0, 0];
    for ($i=0; $i<4; $i++) {
        $xTmp = $x + $dx[$i];
        $yTmp = $y + $dy[$i];
        // 只有终点刚好是边界点才能这样,如果不是则需要另外传边界点
        if ($xTmp>=0 && $xTmp<=$endX && $yTmp>=0 && $yTmp<=$endY && 
            $arr[$xTmp][$yTmp] == 0
        ) {
            $arr[$xTmp][$yTmp] = 1;
            $routeArr[] = [$xTmp, $yTmp];
            fds($xTmp, $yTmp, $endX, $endY, $arr, $routeArr, $routeAllArr);
            array_pop($routeArr);
            $arr[$xTmp][$xTmp] = 0;
        }
    }
    return;
}

封装了两种方法,一种获取到路径就停止,一种获取所有能走通的路径。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务