假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水?
在开始之前我询问了一下人工智能文心一言,得到的答复有些搞笑:
好吧,于是我继续去询问了一下chatgpt3.0:
它在第四步就差点得到正确答案了
所以应该已经知道正确答案是什么了
现在用java来复现一下这个过程:
public class Main {
public static void main(String[] args) {
int fiveCapacity = 0; // 5升水壶当前水量为0
int sixCapacity = 0; // 6升水壶当前水量为0
int step = 0; //操作步数
final int targetwarter = 3; //目标水量
while (true) {
System.out.println("\n当前状态:5升水壶(" + fiveCapacity + "升),6升水壶(" + sixCapacity + "升)");
// 尝试把6升水壶倒入5升水壶中
if (sixCapacity > 0 && fiveCapacity < 5) {
int transferAmount = Math.min(sixCapacity, 5 - fiveCapacity);
sixCapacity -= transferAmount;
fiveCapacity += transferAmount;
System.out.println("将6升水壶中的水倒入5升水壶中");
step++;
System.out.println("第"+step+"步,当前状态:5升水壶(" + fiveCapacity + "升),6升水壶(" + sixCapacity + "升)");
}
if (sixCapacity==targetwarter||fiveCapacity == targetwarter) {
break;
}
// 如果5升水壶已满,则倒掉其中的水
if (fiveCapacity == 5) {
fiveCapacity = 0;
System.out.println("将5升水壶中的水倒掉");
step++;
System.out.println("第"+step+"步,当前状态:5升水壶(" + fiveCapacity + "升),6升水壶(" + sixCapacity + "升)");
}
// 如果6升水壶为空,则装满水
if (sixCapacity == 0) {
sixCapacity = 6;
System.out.println("将6升水壶装满水");
step++;
System.out.println("第"+step+"步,当前状态:5升水壶(" + fiveCapacity + "升),6升水壶(" + sixCapacity + "升)");
}
}
System.out.println("第"+step+"步成功取得"+targetwarter+"升水");
}
}
运行结果:
当前状态:5升水壶(0升),6升水壶(0升)
将6升水壶装满水
第1步,当前状态:5升水壶(0升),6升水壶(6升)
当前状态:5升水壶(0升),6升水壶(6升)
将6升水壶中的水倒入5升水壶中
第2步,当前状态:5升水壶(5升),6升水壶(1升)
将5升水壶中的水倒掉
第3步,当前状态:5升水壶(0升),6升水壶(1升)
当前状态:5升水壶(0升),6升水壶(1升)
将6升水壶中的水倒入5升水壶中
第4步,当前状态:5升水壶(1升),6升水壶(0升)
将6升水壶装满水
第5步,当前状态:5升水壶(1升),6升水壶(6升)
当前状态:5升水壶(1升),6升水壶(6升)
将6升水壶中的水倒入5升水壶中
第6步,当前状态:5升水壶(5升),6升水壶(2升)
将5升水壶中的水倒掉
第7步,当前状态:5升水壶(0升),6升水壶(2升)
当前状态:5升水壶(0升),6升水壶(2升)
将6升水壶中的水倒入5升水壶中
第8步,当前状态:5升水壶(2升),6升水壶(0升)
将6升水壶装满水
第9步,当前状态:5升水壶(2升),6升水壶(6升)
当前状态:5升水壶(2升),6升水壶(6升)
将6升水壶中的水倒入5升水壶中
第10步,当前状态:5升水壶(5升),6升水壶(3升)
第10步成功取得3升水
进程已结束,退出代码为 0