一次整理请求包含多次移动时,后面的动作可能依赖前面的结果。如果中途空间或数量不足,是撤销整批还是保留已经成功的部分,会直接影响最终库存,必须先明确规则。
以下是一组输入完整的独立案例。先读清规则,再按时间或操作顺序记录中间状态;遇到与预期不同的结果时,检查首次出现差异的位置。案例使用明确限定的教学模型,不假定所有作品都采用相同的处理方式。
两个容器各有总件数容量,物品分三类;移动需要来源数量足够且目标容量允许。比较整批原子方式与逐项尽力方式:前者任一失败就还原整批起点,后者跳过失败项继续后项;不允许负数量。
初始两容器三类数量[[2, 3, 3], [2, 0, 3]],总件数容量[13, 9] 每项[来源容器,类型编号,件数],目标为另一容器:[[1, 2, 4], [0, 0, 4], [1, 1, 1], [0, 0, 3], [0, 0, 3], [0, 2, 4], [0, 1, 1], [1, 2, 5], [0, 2, 3]]
逐项方式动作0:容器1向0移动类型2共4件,从[[2, 3, 3], [2, 0, 3]]出发,失败跳过,结果[[2, 3, 3], [2, 0, 3]]。
逐项方式动作1:容器0向1移动类型0共4件,从[[2, 3, 3], [2, 0, 3]]出发,失败跳过,结果[[2, 3, 3], [2, 0, 3]]。
逐项方式动作2:容器1向0移动类型1共1件,从[[2, 3, 3], [2, 0, 3]]出发,失败跳过,结果[[2, 3, 3], [2, 0, 3]]。
逐项方式动作3:容器0向1移动类型0共3件,从[[2, 3, 3], [2, 0, 3]]出发,失败跳过,结果[[2, 3, 3], [2, 0, 3]]。
逐项方式动作4:容器0向1移动类型0共3件,从[[2, 3, 3], [2, 0, 3]]出发,失败跳过,结果[[2, 3, 3], [2, 0, 3]]。
逐项方式动作5:容器0向1移动类型2共4件,从[[2, 3, 3], [2, 0, 3]]出发,失败跳过,结果[[2, 3, 3], [2, 0, 3]]。
逐项方式动作6:容器0向1移动类型1共1件,从[[2, 3, 3], [2, 0, 3]]出发,通过,结果[[2, 2, 3], [2, 1, 3]]。
逐项方式动作7:容器1向0移动类型2共5件,从[[2, 2, 3], [2, 1, 3]]出发,失败跳过,结果[[2, 2, 3], [2, 1, 3]]。
逐项方式动作8:容器0向1移动类型2共3件,从[[2, 2, 3], [2, 1, 3]]出发,通过,结果[[2, 2, 0], [2, 1, 6]]。
整批方式在动作0失败,整批恢复起点。整批结果[[2, 3, 3], [2, 0, 3]],逐项结果[[2, 2, 0], [2, 1, 6]]。
逐类检查两个容器总量守恒,分别重放通过的动作。整批失败时必须与初始状态完全相同;逐项方式的失败项不能扣除任何来源数量,也不能向目标添加物品。
用户界面应让玩家知道采用哪种语义,否则同样的失败提示可能被误解为所有动作都没有发生。这里明确区分两种结果,但不建议在一次操作过程中未经说明地切换规则。
建议保留原始输入、每一步状态和最终输出,再只改变一个条件做对照。重点检查空输入、相等边界、重复请求以及先后顺序;把规则约定、计算过程和显示表现分别核对,比只比较最后一个数字更容易找到原因。