欢迎来到 0713网站目录
登录

给你一个装满水的 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();
        });
    }
}
 
特别提示:

推荐

最新

最新文章

微信公众平台Token验证失败问题总结
这10个实用Linux技能,每一个都值得写进简历!新手必备
关于网站、服务器受攻击问题的相关说明
夏天常喝这3杯水,帮你降火、消暑、祛湿,心脑血管也受益~
夏天不出汗,体内会形成“垃圾”?这4个部位出汗多,可能暗藏健康隐患
KESION(.NET版)安装方法
这个“恐怖游戏”,为什么会在孩子间流行?
Linux系统下已经设置只读文件还是被修改的解决办法
驾考新“捷径”?注意“免考包过”的诈骗陷阱!
不刷牙睡觉VS不刷牙吃早餐,哪个更伤身?答案出乎意料
[原创]批量替换网站程序中的gotoip域名
爱干净的你,这些卫生“好习惯”可能正在“偷”走你的健康!这3个看似偷懒的行为其实没毛病!
网站被反向代理方式镜像处理方法
刘诗诗|绝美
好消息!确定国内 eSIM 要来,但这些设备不能用
地产海报|围炉煮茶活动海报
如何禁用危险的http方法,如TRACE,OPTIONS
虚拟主机设置mime类型(json不能使用需设置)
西部数码网站搭建步骤
李兰迪|壁纸

猜你想看

有氧运动与无氧运动的区别与联系,如何科学塑身,拥有完美身材?
焦虑、心慌,怎么治
高速上车坏担心拖车被坑?这样做方便快捷,不会花大价钱
阔腿裤下面别配平底鞋了!今年杨幂热巴都在这样穿,这也太潮了吧
自己交社保,还是找挂靠单位,怎么做更划算?真的少领4项待遇吗
新入手的兰花怎么养?关键在于服盆,需要做好这几点
卡罗拉对拆朗逸,德系日系谁减配更严重?
心理学:你喜欢的颜色,看出你的性格,以及对异性的吸引力
沉香手串不推荐入手的四个产地
公积金贷款相比商贷,到底省在了哪里?
肾不好,可以喝茶吗,怎么喝最好?
立夏已过,天热了想开空调?这件事一定先做好!
推荐几款男女都爱的中性木质香调香水,难以抗拒的高级香
产品矩阵领航 北汽昌河发力智慧物流2.0时代
高速服务区过夜真的要收钱?做好这2件事,避免被收冤枉钱
全国有5株5000岁以上的古树,古树的年龄是怎么算的?
明日入伏!卫健部门提醒:“三伏贴”不是万能贴,贴敷须对症
汽车电瓶寿命是多长?
北京市医保报销比例一览表来了
春季雨水多,汽车保养不怠慢,否则会伤车