若干年前,刚进入编程行业不久,得到一家公司的笔试机会.其中一题印象深刻:给两个空量杯,一个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号量杯倒满
在这棵树中,每一个结点,理论上有以上六个操作作为子结点.求解的过程就是在这棵树中找到一条路径ÿ