トップページに戻る    次のPHPのサンプルへ    前のPHPのサンプルへ

Q15 幅優先の二分木を深さ優先探索


PHPのソース

<?php
Solve(  10,   6);
Solve(  10,   8);
Solve(3000,2500);

//mとnを引数として解を求める
function Solve($pM , $pN)
{
    $VisitedArr = array();

    $Stk = new SplStack();
    $Stk->push(1);

    while($Stk->isEmpty() == false){
        $Popped = $Stk->pop();

        $VisitedArr[] = $Popped;
        if(count($VisitedArr) == $pN){
            printf('m=%d,n=%dでの解は、%d',$pM,$pN,$Popped);
            //var_export($VisitedArr);
            echo PHP_EOL;
            return;
        }

        $NextNode1 = $Popped * 2;
        $NextNode2 = $NextNode1 + 1;

        if($NextNode2 <= $pM) $Stk->push($NextNode2);
        if($NextNode1 <= $pM) $Stk->push($NextNode1);
    }
}


実行結果

m=10,n=6での解は、5
m=10,n=8での解は、3
m=3000,n=2500での解は、897


解説

幅優先の二分木が存在すると仮定して、
深さ優先探索してます。