游戏动态

两个容量不同的容器怎样用最少操作量出目标:机制演算第24例


容器谜题只允许装满、倒空或互相倾倒时,中间状态是有限的。把每种水量组合当成一个状态,就能系统地找出最短操作过程,或确认目标不可达到。

两个容器容量固定,开始都为空。每次操作只能装满一只、倒空一只,或把一只向另一只倒到来源为空或接收方满为止;当任意一只恰好含目标水量时完成,每次操作成本相同。

本例的输入和输出

容器A容量8,B容量12,目标为任意容器中恰好11单位水;初始状态为[0,0]。

是否存在解:False,最少操作数:None。 操作 | 操作后A、B水量 本次搜索已登记10个不同状态。

表格中的编号只标识当前例子的元素,不应把对象身份、数组下标与计算数值混为一谈。阅读时先核对输入和边界,再沿记录检查每一步;空结果表示规则下没有可用项,并不是默认返回数值零。

复核与适用条件

每一步水量都必须在容量范围内,倾倒不会凭空增加总量,装满与倒空则明确改变总量。最少步数按操作次数计算,不能把倒了多少水当成一步的成本。

这是抽象整数水量模型,不允许凭目测中途停倒,也没有标刻、损耗或容器形状影响。若规则允许任意停倒,问题的可达状态和最短解都会改变,不能沿用本例的结论。

练习时先独立复算一小段,再检查整体结果是否满足文中条件。遇到差异应保留中间记录并定位第一处不一致,而不是只调整最后答案。更换输入或操作规则后,需要重新计算,原记录只对这一例负责。

为什么可以判断最短或无解

搜索按零步、一步、两步这样的层次向外展开,每个水量组合只在第一次到达时登记来源。因为所有操作成本相同,首次遇到目标时不可能还有更少步骤的未检查路径。装满后再倾倒是两次操作,不能为了缩短记录把它们合并。没有改变水量的操作也无需重复搜索。

本例最多有117种整数水量组合。如果所有从空容器能到达的组合都已检查仍未出现目标,就能在这套规则内判定无解;这个结论并不允许额外凭目测停倒。