回溯法

2021-01-18  本文已影响0人  lifefruity

回溯法就是类似穷举,类似下面的3个for循环,他们的结果是一样的。这个例子中可能结果出现111,122这样重复的,需要优化,其实只要在 let =able[$i] 的后面插入以下就行

if(in_array($let, $selected)){
    continue;
}
<?php
//利用回溯法,写出1,2,3组成的全排列


//就是穷举的例子
function func($selected, $able){
    if(count($selected) == 3){
        echo implode('', $selected)."\n";
        return;
    }
    
    for($i = 0; $i < count($able); $i++){
        //step 1. 可选解【放入】到已选集合中
        $let = $able[$i];
        $selected[] = $let;


        //step 2. 进入下一个阶段
        func($selected, $able);
        
        //这里其实应该说是满足selected为3后,进行依次回溯
        
        //var_dump($selected);exit;//这一句一打就知道了,111,112,113,一轮for完成了,然后最后的去除,再121,122,123开始,类似先进后出
        //step 3. "回溯"换个解再遍历(已选解集合中【删除】可选解)
        array_pop($selected);
        
        
    }
    
}

func([], [1,2,3]);

/*
$arr = [1,2,3];
for($i = 0 ; $i < count($arr); $i++){
    for($j = 0 ; $j < count($arr); $j++){
        for($k = 0 ; $k < count($arr); $k++){
            //echo $arr[$i].$arr[$j].$arr[$k]."\n";
        }
    }
}
*/
上一篇 下一篇

猜你喜欢

热点阅读