3L, 5L, 8L三个水桶等分8L水 Java(递归, 穷举)

news/2024/10/30 14:15:25/

题目

有三个容积分别是8升、5升和3升的水桶,其中容积为8升的水桶中有8升水,其它两个水桶是空的。三个水桶都没有刻度,问如何在不借助其它工具的情况下只使用这三个桶把8升水等分。

代码

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;/*** Created by GuanDS on 2018/8/22.*/
public class Test {private static int[] limits = new int[]{8, 5, 3};private static int count = 0;private static List<Set<String>> methods = new ArrayList<>();public static void main(String[] args) {change(new int[]{8, 0, 0}, new LinkedHashSet<>());System.out.println("共" + count + "种方式");for (Set<String> steps : methods) {System.out.println("---------------------------------------");for (String step : steps) {System.out.println(step);}System.out.println("---------------------------------------\n\n");}}public static void change(int[] array, Set<String> steps) {String str = array[0] + ", " + array[1] + ", " + array[2];if (steps.contains(str)) {// 方案已经被处理过了return;}if (array[0] == 4 && array[1] == 4) {steps.add("4, 4, 0");methods.add(steps);count++;return;}for (int i = 0; i < array.length; i++) { // 遍历出水桶if (array[i] == 0) { // 水桶没有水, 只能被注入continue;}for (int j = 0; j < array.length; j++) { // 遍历进水桶int[] temp = array.clone();if (i != j) { // 不能是自己if (array[j] == limits[j]) { // 被注入的桶已经满了continue;}int change = limits[j] - array[j]; // 要么把进水桶注满, 要么把出水桶的水用完if (array[i] < change) {change = array[i];}temp[j] = temp[j] + change; // 进水桶进水temp[i] = temp[i] - change; // 出水桶出水Set<String> stepsTemp = new LinkedHashSet<>(); // copy之前步骤, 做备份stepsTemp.addAll(steps);stepsTemp.add(str); // 记录此步骤change(temp, stepsTemp);}}}}}

结果

共16种方式
---------------------------------------
8, 0, 0
3, 5, 0
0, 5, 3
5, 0, 3
5, 3, 0
2, 3, 3
2, 5, 1
7, 0, 1
7, 1, 0
4, 1, 3
4, 4, 0
------------------------------------------------------------------------------
8, 0, 0
3, 5, 0
3, 2, 3
0, 5, 3
5, 0, 3
5, 3, 0
2, 3, 3
2, 5, 1
7, 0, 1
7, 1, 0
4, 1, 3
4, 4, 0
---------------------------------------...........---------------------------------------
8, 0, 0
5, 0, 3
5, 3, 0
2, 3, 3
2, 5, 1
3, 5, 0
3, 2, 3
6, 2, 0
6, 0, 2
1, 5, 2
1, 4, 3
4, 4, 0
---------------------------------------

 


http://www.ppmy.cn/news/573917.html

相关文章

智力题——5L的桶和3L的桶如何装4L的水

文章目录 智力题——5L的桶和3L的桶如何装4L的水问题描述直观分析问题建模问题解决 智力题——5L的桶和3L的桶如何装4L的水 问题描述 有一个5L的桶A和一个3L的桶B以及无限量的水&#xff0c;如何让5L的桶装4L的水。 支持操作&#xff1a;加水&#xff0c;倒水&#xff0c;A倒…

【原理图PCB专题】案例:SOT-23和SOT-23-3L有什么区别

背景 最近在导一些分立元件的替代料,有一些是其他部门使用过的料,有一些是全新的料。全新的物料是供应商通过分析我们现有的用料直接将类似的器件资料汇集起来,提供样品和规格书让我们进行评估。 其实就算是其他部门导入的物料,在我看来也算是新部品导入了。对于这类器件…

容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。程序输出分油次数最少的详细操作过程

引入 1、容器里有10升油&#xff0c;现在只有两个分别能装3升和7升油的瓶子&#xff0c;需要将10 升油等分成2 个5 升油。程序输出分油次数最少的详细操作过程。 思考 这题主要是要求了输出分油次数最少的操作&#xff0c;网上很多算法都是寻找可行解&#xff0c;没有找出最…

如何用一个3L的桶和一个5L的桶, 量出4L水来?

遇到一个小趣味题&#xff1a; 一个水池&#xff0c;旁边有两个水桶&#xff0c; 一个装 3L 的水&#xff0c; 一个可装 5L 的水&#xff0c; 问:如何利用这两个桶&#xff0c; 精确的量出 4L 的水来&#xff1f; My Keys: 可分五步完成 &#xff0c;写了个步骤列表&#xf…

给你一个 5L 和 3L 桶,水无限多,怎么到出 4L。

智力题 给你一个 5L 和 3L 桶&#xff0c;水无限多&#xff0c;怎么到出 4L。 思考过程 先将 3L 的桶装满水&#xff0c;倒入 5L 的桶里。 再重新将 3L 的桶装满水&#xff0c;倒入 5L 的桶里&#xff0c;把 5 L 的桶装满后&#xff0c;这样 3L 的桶中就剩下 1L 的水了。 然后把…

log4j日志打印详解实战

1.为什么要使用log4j? Log4j是Apache的一个开放源代码项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等&#xff1b;我们也可以控制每一条日志的输出格式&am…

springboot配置log4j 并打印SQL

首先引入jar包依赖 <!--Log4J--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j</artifactId> </dependency> 因为springboot 默认有自己的日志管理机制 所以要排除一下springb…

imagej得到灰度图数据_ImageJ的高级使用方法

今天我们继续来聊一聊ImageJ的高阶使用技巧。 问题三、为什么总是全部圈起来的灰度值,有没有大神指导呢求助! 本问题涉及免疫印迹(Western Blot)分析,提问者不能分别得到每个条带的值。 灰度值0为纯黑,255为纯白,灰度值与光密度值(OD值)的关系如下图所示: 以灰度来统计WB…