算法面试 - 水壶问题

Mr.zhuMr.zhu2025-05-30 07:50:14来源:优站库 (www.uzkoo.com)阅读:166

给你一个装满水的 8 升满壶和两个分别是 5 升、3 升的空壶,请想个优雅的办法,使得其中一个水壶恰好装 4 升水,每一步的操作只能是倒空或倒满。

 

每走一步,杯中不重复的状态变化

 

import JAVA.util.ArrayList;
import java.util.List;

// 水壶问题
public class Kettle {
    private static class Status {
        int[] kettles = new int[3];

        Status(int k0, int k1, int k2) {
            kettles[0] = k0;
            kettles[1] = k1;
            kettles[2] = k2;
        }
        Status(Status status) {
            kettles[0] = status.kettles[0];
            kettles[1] = status.kettles[1];
            kettles[2] = status.kettles[2];
        }

        public boolean isSuccess(int code) {
            return kettles[0] == code || kettles[1] == code || kettles[2] == code;
        }

        @Override
        public boolean equals(Object obj) {
            Status status = (Status) obj;
            return kettles[0] == status.kettles[0] && kettles[1] == status.kettles[1] && kettles[2] == status.kettles[2];
        }
    }

    static int successCode = 4;                                     // 最终需要包含的状态
    static int[] capitals = {8, 5, 3};                              // 水壶容量
    static Status initStatus = new Status(8, 0, 0);                 // 初始值
    static List<Status> statuses = new ArrayList<Status>() {{       // 初始数组
        add(new Status(initStatus));
    }};
    static List<List<Status>> results = new ArrayList<>();          // 结果数组

    static void iterate(Status status, List<Status> statuses) {
        if (status.isSuccess(successCode)) {
            results.add(new ArrayList<>(statuses));
            return;
        }
        for (int i = 0; i < capitals.length; i++) {
            for (int j = 0; j < capitals.length; j++) {
                if (i == j) continue;
                if (status.kettles[i] == 0 || status.kettles[j] == capitals[j]) continue;
                int difference = Math.min(status.kettles[i], capitals[j] - status.kettles[j]);
                status.kettles[i] -= difference;
                status.kettles[j] += difference;
                if (!statuses.contains(status)) {
                    statuses.add(new Status(status));
                    iterate(status, statuses);
                    statuses.remove(status);
                }
                status.kettles[i] += difference;
                status.kettles[j] -= difference;
            }
        }
    }

    public static void main(String[] args) {
        iterate(initStatus, statuses);
        System.out.println("结果数量:" + results.size());
        results.forEach(statuses -> {
            statuses.forEach(status -> System.out.print(" -> " + status.kettles[0] + ", " + status.kettles[1] + ", " + status.kettles[2]));
            System.out.println();
        });
    }
}
 

猜你想看

55寸液晶电视怎么选?全面屏、高音画、AI交互一个也不能少
核武器原理都知道,为何很多国家倾全力也造不出,究竟难在哪里?
对于买车很困惑,不知道选什么车?这些知识能帮到你
化妆水是鸡肋还是真的有用?用错方法神仙水一样只是瓶水
汽车“不休息”可以跑多少公里?用实际距离告诉你答案
在阳江阳西这座充满魅力的城市中,西湖公园宛如一颗璀璨的明珠,静静地镶嵌在城市中央,散发着独特的光芒
老实人“嘴笨不会说话”?记住以下4个原则,让你变得能言善辩
Lisa参加疯马秀,为什么内娱吵翻了天?
网站没排名:为什么网站在Google上没有排名?
错过动车怎么办 车票作废了吗?现在知道还不晚
《逆水寒手游》标点打怪方法介绍一览
中国最“有名”的4条步行街,去过2条算及格,你都去过几条
喝剩的葡萄酒怎么保存?有何妙用?
购买电动车的雷区和误区很多,想要满意、须掌握5个常识
茶叶到底有没有保质期?
你知道反光镜上小镜子的真实作用吗?
𝙎𝙝𝙖𝙧𝙚刘浩存|看到你漂亮的眼睛一直笑也算我幸福的一种
社交中屡试不爽的经典话术,社恐患者也能轻松成为社交王
职工养老保险可以补缴吗?如何办理补缴?
4食物是“天然防晒霜”,夏季多吃些,补水养颜,皮肤越来越白

推荐站点