一道有趣的笔试题( 水杯量水问题 )

  若干年前,刚进入编程行业不久,得到一家公司的笔试机会.其中一题印象深刻:给两个空量杯,一个5ml,一个3ml,加水后,要通过量杯互倒,得到4ml水,求算法.

  之前做过一个人机对战的游戏,接触到决策树.看到这道题时,第一感觉应该也是可以用树形数据结构来解决的.虽然它不属于博弈类的问题。

  最初考虑,以量杯作为树的结点,在树中找出一条路径( 分支 ),使得路径终结点的当前水量为4ml,那么问题就得到解决。但仔细考虑,发现这思路有些问题,比如:5ml量杯的水倒入3ml量杯后,再向5ml量杯中倒水,在这棵树就无法表示。

  再仔细分析一下问题,所求算法的输出是一个操作流程。操作流程的每一步都是一个操作。也就是说,在这个问题中,要提练的数据是"操作",而不是"量杯".

  这个问题想清楚后,就好办了.用树是对的,只是结点应该是操作而不是量杯.

  所有的操作总共有六种:

        5->3     表5号量杯倒入3号量杯

  3->5     表3号量杯倒入5号量杯

  5->E     表将5号量杯的水倒空

  3->E     表将3号量杯的水倒空

  F->5     表将5号量杯倒满

  F->3     表将3号量杯倒满


  在这棵树中,每一个结点,理论上有以上六个操作作为子结点.求解的过程就是在这棵树中找到一条路径ÿ

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值