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

news/2024/10/30 14:14:41/

文章目录

  • 智力题——5L的桶和3L的桶如何装4L的水
    • 问题描述
    • 直观分析
    • 问题建模
    • 问题解决

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

问题描述

有一个5L的桶A和一个3L的桶B以及无限量的水,如何让5L的桶装4L的水。
支持操作:加水,倒水,A倒入B,B倒入A,除此之外不再支持其他操作,例如做记号或者借助其他工具

直观分析

直观分析就是利用我们的直观思维在草纸上不停的模拟这些操作,这个很不好说,对于简单问题你可能可以模拟出来,可是问题一旦复杂起来,就必须得对问题抽象建模。问题的最终解如下图:
在这里插入图片描述
A和B的水量转移状态如下:
(0,0)->(5,0)->(2,3)->(2,0)->(0,2)->(5,2)->(4,3)

问题建模

我们可以把转移过程画成一张图,如下是整张图的一部分,现在就转化成图论的遍历算法了,即从(0,0)找到一条路径到(4,x)即可,DFS和BFS我选择BFS,因为BFS天然可以求无向图最短路径,我们要保证操作最少
在这里插入图片描述
我们先进行一次状态压缩,把ab两个桶的水量压缩成一个整数,例如4,3压缩成43,这样采取取整和求余就可以分别得知ab的水量

问题解决

package com.lry.basic.algorithm.graph;import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;public class WaterPuzzle {private int A=5;private int B=3;private int require=4;private boolean[] visited = new boolean[A*10+B+1];private int[] pre = new int[A*10+B+1];private int end = -1;private void bfs(){Queue<Integer> queue = new LinkedList<>();queue.offer(0);visited[0] = true;while(!queue.isEmpty()){int cur = queue.poll();int a = cur/10;int b = cur%10;List<Integer> nextList = next(a,b);for (int next:nextList) {if(!visited[next]){queue.offer(next);visited[next] = true;pre[next] = cur;//保存cur到next这条路径if(next/10==require||next%10==require){//找到一个解就提前返回end = next;return;}}}}}private List<Integer> next(int a,int b){//下一个状态的数组List<Integer> nextList = new ArrayList<>();//经过四种操作的nextList//给a装满水nextList.add(A*10+b);//给b装满水nextList.add(a*10+B);//a倒掉全部水nextList.add(b);//b倒掉全部水nextList.add(a*10);//a倒入bint x = Math.min(a,B-b);//看a中的水量和b中剩余的空间,谁小nextList.add((a-x)*10+b+x);//b倒入aint y = Math.min(b,A-a);//看b中的水量和a中剩余的空间,谁小nextList.add((a+y)*10+b-y);return nextList;}private Iterable<Integer> path(){List<Integer> res = new ArrayList<>();if(end==-1){return res;}int cur = end;while(cur!=0){res.add(0,cur);cur = pre[cur];}res.add(0,0);return res;}public static void main(String[] args) {WaterPuzzle puzzle = new WaterPuzzle();puzzle.bfs();System.out.println(puzzle.path());}}

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

相关文章

【原理图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…

【C++ 程序设计】第 5 章:类的继承与派生

目录 一、类的继承与类的派生 &#xff08;1&#xff09;继承的概念 &#xff08;2&#xff09;派生类的定义与大小 ① 派生类的定义 ② 派生类的大小 &#xff08;3&#xff09;继承关系的特殊性 &#xff08;4&#xff09;有继承关系的类之间的访问 &#xff08;5&am…