题目:
标题:分红酒
有4个红酒瓶子,它们的容量分别是:9升, 7升, 4升, 2升
开始的状态是 [9,0,0,0],也就是说:第一个瓶子满着,其它的都空着。
允许把酒从一个瓶子倒入另一个瓶子,但只能把一个瓶子倒满或把一个瓶子倒空,不能有中间状态。这样的一次倒酒动作称为1次操作。
假设瓶子的容量和初始状态不变,对于给定的目标状态,至少需要多少次操作才能实现?
本题就是要求你编程实现最小操作次数的计算。
输入:最终状态(逗号分隔)
输出:最小操作次数(如无法实现,则输出-1)
例如:
输入:
9,0,0,0
应该输出:
0
输入:
6,0,0,3
应该输出:
-1
输入:
7,2,0,0
应该输出:
2
分析:
对于状态的理解,对于学习算法是非常重要的,尤其是对于搜索的算法和动态规划的算法。我们可以把四个瓶子里面的水的体积抽象成一种状态(a, b, c, d),然后状态转移无非就是a->b, b->a, c-> a, a->c, b->c, c->b, d->a, a->d, d->c, c->d, b->d, d->b共A(4,2) = 3 * 4 = 12种。当然其中有一些操作是无效的,比如a为空,a就不可以倒给其他瓶子了。a要是满,其他瓶子也