美文网首页
PHP算法之倒水问题

PHP算法之倒水问题

作者: 小牛_6666 | 来源:发表于2019-05-16 00:26 被阅读0次

这类题目在面试中会经常遇到,最常见的是给你一个容量为5升的桶和一个容量为3升的桶,水不限使用,要求精确得到4升水。

解法网上有很多,本文采用的是宽度优先搜索。

PHP代码:

<?php
#倒水问题
fwrite(STDOUT,'请输入A桶容量:');
$a=intval(fgets(STDIN));
fwrite(STDOUT,'请输入B桶容量:');
$b=intval(fgets(STDIN));
fwrite(STDOUT,'请输入需要量出的水:');
$want=intval(fgets(STDIN));
$question="问题:给你一个容量为{$a}升的A桶和一个容量为{$b}升的B桶,水不限使用,要求精确得到{$want}升水。\n";
echo $question;
$status=[['a'=>0,'b'=>0,'comment'=>['开始']]];
$processed=[];
pour_water($a,$b,$want,$status,$processed);
function pour_water($a,$b,$want,$status,&$processed){
    $newStatus=[];
    foreach ($status as $k=>$v){
        if(isset($processed[$v['a']][$v['b']])){
            continue;
        }else{
            $processed[$v['a']][$v['b']]=true;
        }
        if($v['a']==$want || $v['b']==$want){
            print_result($v['comment']);
            exit;
        }
        #1,把A倒满
        if($v['a']<$a){
            $tmp['a']=$a;
            $tmp['b']=$v['b'];
            $tmp['comment']=array_merge($v['comment'],["装满A桶(A:{$tmp['a']},B:{$tmp['b']})"]);
            $newStatus[]=$tmp;
        }
        #2,把B倒满
        if($v['b']<$b){
            $tmp['a']=$v['a'];
            $tmp['b']=$b;
            $tmp['comment']=array_merge($v['comment'],["装满B桶(A:{$tmp['a']},B:{$tmp['b']})"]);
            $newStatus[]=$tmp;
        }
        #3将A桶清空
        if($v['a']>0){
            $tmp['a']=0;
            $tmp['b']=$v['b'];
            $tmp['comment']=array_merge($v['comment'],["清空A桶(A:{$tmp['a']},B:{$tmp['b']})"]);
            $newStatus[]=$tmp;
        }
        #4将B桶清空
        if($v['b']>0){
            $tmp['a']=$v['a'];
            $tmp['b']=0;
            $tmp['comment']=array_merge($v['comment'],["清空B桶(A:{$tmp['a']},B:{$tmp['b']})"]);
            $newStatus[]=$tmp;
        }
        #5将A倒入B桶
        if($v['a']>0 && $v['b']<$b){
            $pour=min($v['a'],$b-$v['b']);
            $tmp['a']=$v['a']-$pour;
            $tmp['b']=$v['b']+$pour;
            $tmp['comment']=array_merge($v['comment'],["从A桶倒入B桶:{$pour} (A:{$tmp['a']},B:{$tmp['b']})"]);
            $newStatus[]=$tmp;
        }
        #6将B桶倒入A桶
        if($v['a']<$a && $v['b']>0){
            $pour=min($a-$v['a'],$v['b']);
            $tmp['a']=$v['a']+$pour;
            $tmp['b']=$v['b']-$pour;
            $tmp['comment']=array_merge($v['comment'],["从B桶倒入A桶:{$pour} (A:{$tmp['a']},B:{$tmp['b']})"]);
            $newStatus[]=$tmp;
        }
    }
    if($newStatus){
        pour_water($a,$b,$want,$newStatus,$processed);
    }
}

function print_result($c){
    foreach ($c as $k=>$v){
        echo "{$k},{$v}\n";
    }
    echo "结束\n";
}

执行结果:

请输入A桶容量:3
请输入B桶容量:5
请输入需要量出的水:4
问题:给你一个容量为3升的A桶和一个容量为5升的B桶,水不限使用,要求精确得到4升水。
0,开始
1,装满B桶(A:0,B:5)
2,从B桶倒入A桶:3 (A:3,B:2)
3,清空A桶(A:0,B:2)
4,从B桶倒入A桶:2 (A:2,B:0)
5,装满B桶(A:2,B:5)
6,从B桶倒入A桶:1 (A:3,B:4)
结束

相关文章

  • PHP算法之倒水问题

    这类题目在面试中会经常遇到,最常见的是给你一个容量为5升的桶和一个容量为3升的桶,水不限使用,要求精确得到4升水。...

  • 算法之倒水的问题

    需求:现在只有两只杯子,容量分别是:5升和7升,问题是:在只用这两个杯子的前提下,如何才能得到4升水?假设:水可以...

  • 倒水的算法

    3准确秤量任务 两个空烧杯容量是9升和11.25升: 容许用这些动作: 从水龙头处完全灌满一个容器将一个容器内的水...

  • PHP经典算法之背包问题

    问题:假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号、...

  • dijkstra算法解决3杯倒水问题

  • PHP单链表判断回文字符串

    1、背景 最近在学习王争老师的数据结构与算法之美,自己将课程中涉及的算法用PHP的形式表达出来,程序写的有问题,欢...

  • PHP算法之过河问题

    方法一:动态规划 运行结果 方法二:数学归纳 运行结果

  • 扣丁学堂PHP开发实现解汉诺塔问题及算法详解

    今天扣丁学堂PHP培训老师给大家介绍一下关于PHP实现的解汉诺塔问题及相应的实现算法,并结合实例形式给出了PHP具...

  • PHP常用数组排序算法

    title: PHP常用数组排序算法tags: [PHP,数组,排序,算法] 这几天写到的代码中,用到了许多对数组...

  • 2018-08-02

    php实现组合枚举算法 源码

网友评论

      本文标题:PHP算法之倒水问题

      本文链接:https://www.haomeiwen.com/subject/wrivaqtx.html