java复现 超难的75道逻辑思维题之池塘装水

假设有一个池塘,里面有无穷多的水。现有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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java中,可以使用以下几种方式来实现单例模式: 1. 饿汉式: ``` public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } } ``` 这种方式在类加载时就创建了实例,因此是线程安全的。 2. 懒汉式(非线程安全): ``` public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 这种方式在第一次调用getInstance()方法时才创建实例,但是在多线程环境下可能会创建多个实例。 3. 懒汉式(线程安全,使用synchronized关键字): ``` public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 这种方式通过给getInstance()方法加锁来保证线程安全,但是会影响性能。 4. 双重检查锁定(Double-Checked Locking): ``` public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` 这种方式在第一次调用getInstance()方法时才创建实例,并且通过双重检查锁定来保证线程安全和性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzl_Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值