广度优先和深度优先搜索

lobo · 2019-07-08 10:20:36 · 1221 次点击 · 预计阅读时间 4 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2019-07-08 10:20:36 的文章,其中的信息可能已经有所发展或是发生改变。

<?php

error_reporting(E_ALL);

ini_set('display_errors','On');

// 一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。

$arr = array(

array(0, 1, 0, 0, 0), // i = 0
array(0, 0, 0, 1, 0), // i = 1
array(0, 1, 1, 0, 0),
array(0, 1, 1, 0, 1),
array(0, 0, 0, 0, 1),
array(0, 1, 0, 0, 0) // i = 5

);

$ii = count($arr);

$jj = count($arr[0]);

echo "广度优先搜索", PHP_EOL;

$map = $map2 = array();

for ($i=0; $i < $ii; $i++) {

for ($j=0; $j < $jj; $j++) { 
    $map2[$i][$j] = 0;
}

}

$map = $map2;

for ($i=0; $i < $ii; $i++) {

for ($j=0; $j < $jj; $j++) { 
    echo sprintf("%2d", $arr[$i][$j]) ." ";
}
echo PHP_EOL;

} echo PHP_EOL;

$ret = travelMap($arr, [0,0], [4,3], $map2);

echo PHP_EOL;

for ($i=0; $i < $ii; $i++) {

for ($j=0; $j < $jj; $j++) { 
    echo sprintf("%2d", $map2[$i][$j]) ." ";
}
echo PHP_EOL;

}

echo PHP_EOL;

// 广度优先搜索 (最优解,最短的路径)

function travelMap($map, $st, $end, &$map2 = array()){

if ($map&& $st&& $end) {
    $list = array($st);
    $map2[$st[1]][$st[0]] = 1;
    do{
        $break = false;
        $pos = array_pop($list);
        // echo PHP_EOL, json_encode($pos), PHP_EOL;
        foreach (array([-1,0], [0,-1], [1,0], [0,1]) as $v) {
            $i = $pos[0] + $v[0];
            $j = $pos[1] + $v[1];
            if (!isset($map[$i][$j])) {
               continue;
            }
            if ($map[$i][$j]) {
               continue;
            }
            $weight = 1; // 权重值 步数、距离等
            $val = $map2[$pos[0]][$pos[1]] + $weight;
            if (isset($map2[$i][$j]) && $map2[$i][$j]>0 && $map2[$i][$j] < $val) {
                continue;
            }
            $map2[$i][$j] = $val;
            if ($i == $end[0] && $j == $end[1]) {
                $break = true;
                break;
            }
            array_unshift($list, [$i, $j]);
        }
        if ($break) {
            break;
        }
    }while($list);
    return true;
}
return false;

}

echo "深度优先",PHP_EOL;

travelMap2($arr,[0,0], [4,3], $map);

for ($i=0; $i < $ii; $i++) { for ($j=0; $j < $jj; $j++) { echo sprintf("%2d", $map[$i][$j]) ." "; } echo PHP_EOL; }

echo PHP_EOL;

// 深度优先

function travelMap2($map, $st, $end, &$map2 = array()){

if ($map && $st && $end && $map2) {
    $stack = array($st);
    $map2[$st[1]][$st[0]] = 1;
    do{
        $break = false;
        $pos = array_pop($stack);
        // echo PHP_EOL, json_encode($pos), PHP_EOL;
        foreach (array([-1,0], [0,-1], [1,0], [0,1]) as $v) {
            $i = $pos[0] + $v[0];
            $j = $pos[1] + $v[1];
            if (!isset($map[$i][$j])) {
               continue;
            }
            if ($map[$i][$j]) {
               continue;
            }
            $weight = 1; 
            $val = $map2[$pos[0]][$pos[1]] + $weight;
            if (isset($map2[$i][$j]) && $map2[$i][$j]>0 && $map2[$i][$j] < $val) {
                continue;
            }
            $map2[$i][$j] = $val;
            if ($i == $end[0] && $j == $end[1]) {
                break;
            }
            array_push($stack, [$i, $j]);
        }

    }while($stack);
    return true;
}
return false;

}


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1221 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传