分酒
来源:互联网 发布:淘宝刷真实流量软件 编辑:程序博客网 时间:2024/04/19 06:21
题目:
泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布。
有一次闲暇时,他提出过一个有趣的问题,后称为:“泊松分酒”。在我国古代也提出过类似问题,遗憾的是没有进行彻底探索,其中流传较多是:“韩信走马分油”问题。
有3个容器,容量分别为12升,8升,5升。其中12升中装满油,另外两个空着。要求你只用3个容器操作,最后使得某个容器中正好有6升油。
下面的列表是可能的操作状态记录:
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
1,8,3
1,6,5
每行3个数据,分别表示12,8,6升容器中的油量
第一行表示初始状态,第二行表示把12升倒入8升容器后的状态,第三行是8升倒入5升,...
当然,同一个题目可能有多种不同的正确操作步骤。
本题目的要求是,请你编写程序,由用户输入:各个容器的容量,开始的状态,和要求的目标油量,程序则通过计算输出一种实现的步骤(不需要找到所有可能的方法)。如果没有可能实现,则输出:“不可能”。
例如,用户输入:
12,8,5,12,0,0,6
用户输入的前三个数是容器容量(由大到小),接下来三个数是三个容器开始时的油量配置,最后一个数是要求得到的油量(放在哪个容器里得到都可以)
则程序可以输出(答案不唯一,只验证操作可行性):
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
1,8,3
1,6,5
泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布。
有一次闲暇时,他提出过一个有趣的问题,后称为:“泊松分酒”。在我国古代也提出过类似问题,遗憾的是没有进行彻底探索,其中流传较多是:“韩信走马分油”问题。
有3个容器,容量分别为12升,8升,5升。其中12升中装满油,另外两个空着。要求你只用3个容器操作,最后使得某个容器中正好有6升油。
下面的列表是可能的操作状态记录:
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
1,8,3
1,6,5
每行3个数据,分别表示12,8,6升容器中的油量
第一行表示初始状态,第二行表示把12升倒入8升容器后的状态,第三行是8升倒入5升,...
当然,同一个题目可能有多种不同的正确操作步骤。
本题目的要求是,请你编写程序,由用户输入:各个容器的容量,开始的状态,和要求的目标油量,程序则通过计算输出一种实现的步骤(不需要找到所有可能的方法)。如果没有可能实现,则输出:“不可能”。
例如,用户输入:
12,8,5,12,0,0,6
用户输入的前三个数是容器容量(由大到小),接下来三个数是三个容器开始时的油量配置,最后一个数是要求得到的油量(放在哪个容器里得到都可以)
则程序可以输出(答案不唯一,只验证操作可行性):
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
1,8,3
1,6,5
每一行表示一个操作过程中的油量状态。
递归实现
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.HashSet;import java.util.Scanner;import java.util.Set;/** * * @author 秦哲 * */public class FenJiu {//private static int w1 = 12,// w2 = 8,// w3 = 5,// v1 = 12,// v2 = 0,// v3 = 0,// end = 6;////private static int son1v1, son1v2, son1v3,// son2v1, son2v2, son2v3,// son3v1, son3v2, son3v3,// son4v1, son4v2, son4v3,// son5v1, son5v2, son5v3,// son6v1, son6v2, son6v3;private static int w1,w2,w3,v1,v2,v3,end;private static ArrayList al;//private static HashSet hs;private static Set<String> hs = new HashSet<String>(); public static void main(String[] args) { Shuru(); al = new ArrayList(); hs = new HashSet(); //hs.add("4 3 5"); Panduan(v1, v2, v3); int n = al.size(); if(n == 0){ System.out.println("不可能"); } else{ for(int i=n-1; i>=0; i--) System.out.println(al.get(i)); } //System.out.println(hs); /*for(int i=flag; i>=0; i--){ System.out.println(al.get(i)); } if(flag == -1){ //if(al.size() == 0) System.out.println("No way!"); } else{ }*/ } public static void Shuru(){ System.out.println("请依次输入3个容器的容量,开始的状态,和要求的目标油量,用逗号隔开,回车结束:"); String str = null;try {str = new BufferedReader(new InputStreamReader(System.in)).readLine();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} Scanner sc = new Scanner(str); sc.useDelimiter(","); w1 = sc.nextInt(); //System.out.println(w1); w2 = sc.nextInt(); //System.out.println(w2); w3 = sc.nextInt(); //System.out.println(w3); v1 = sc.nextInt(); //System.out.println(v1); v2 = sc.nextInt(); //System.out.println(v2); v3 = sc.nextInt(); //System.out.println(v3); end = sc.nextInt(); //System.out.println(end); sc.close(); } public static boolean Panduan(int vv1, int vv2, int vv3) { int son1v1, son1v2, son1v3, son2v1, son2v2, son2v3, son3v1, son3v2, son3v3, son4v1, son4v2, son4v3, son5v1, son5v2, son5v3, son6v1, son6v2, son6v3; String step = vv1 + " " + vv2 + " " + vv3; //System.out.println(step); //al.add(step); if(isEnd(vv1, vv2, vv3)){ al.add(step); //flag++; return true; } if(hs.add(step)){ //1倒入2 if(vv1 > (w2-vv2)){ son1v1 = vv1 - (w2 - vv2); son1v2 = w2; son1v3 = vv3; } else{ son1v1 = 0; son1v2 = vv1 + vv2; son1v3 = vv3; } //1倒入3 if(vv1 > (w3-vv3)){ son2v1 = vv1 - (w3 - vv3); son2v2 = vv2; son2v3 = w3; } else{ son2v1 = 0; son2v2 = vv2; son2v3 = vv1 + vv3; } //2倒入1 if(vv2 > (w1-vv1)){ son3v1 = w1; son3v2 = vv2 - (w1 - vv1); son3v3 = vv3; } else{ son3v1 = vv1 + vv2; son3v2 = 0; son3v3 = vv3; } //2倒入3 if(vv2 > (w3-vv3)){ son4v1 = vv1; son4v2 = vv2 - (w3 - vv3); son4v3 = w3; } else{ son4v1 = vv1; son4v2 = 0; son4v3 = vv2 + vv3; } //3倒入1 if(vv3 > (w1-vv1)){ son5v1 = w1; son5v2 = vv2; son5v3 = vv3 - (w1 - vv1); } else{ son5v1 = vv1 + vv3; son5v2 = vv2; son5v3 = 0; } //3倒入2 if(vv3 > (w2-vv2)){ son6v1 = vv1; son6v2 = w2; son6v3 = vv3 - (w2 - vv2); } else{ son6v1 = vv1; son6v2 = vv2 + vv3; son6v3 = 0; }// System.out.println(son1v1+" "+son1v2+" "+son1v3);// System.out.println(son2v1+" "+son2v2+" "+son2v3);// System.out.println(son3v1+" "+son3v2+" "+son3v3);// System.out.println(son4v1+" "+son4v2+" "+son4v3);// System.out.println(son5v1+" "+son5v2+" "+son5v3);// System.out.println(son6v1+" "+son6v2+" "+son6v3); if(Panduan(son1v1, son1v2, son1v3) || Panduan(son2v1, son2v2, son2v3) || Panduan(son3v1, son3v2, son3v3) || Panduan(son4v1, son4v2, son4v3) || Panduan(son5v1, son5v2, son5v3) || Panduan(son6v1, son6v2, son6v3)){ al.add(step); //flag++; return true; } else{ return false; } } else{ return false; } } public static boolean isEnd(int vvv1, int vvv2, int vvv3){ if(vvv1 == end || vvv2 == end || vvv3 == end) { return true; } else { return false; } } }
- 分酒
- 分酒问题
- 分酒问题
- 分酒问题
- 蓝桥杯---分酒
- 分酒问题
- 分
- 分
- 分
- 分
- 分酒问题(摘录)
- [蓝桥杯][java]海盗分酒
- 关于分酒的问题
- 一个分酒问题的求解
- 分酒问题与JOJ 1200 Jugs
- java实现分酒(泊松分酒)
- 海盗分酒(数学问题)
- 波瓦松分酒问题的分析
- nova scheduler 调度实现分析 源码分析
- 短信猫在虚拟机kvm上得安装和配置
- C# DataTable 过滤重复数据
- CruiseControl.Net 与 FxCop 集成
- goole广告代码样例
- 分酒
- 铁幕(Iron Curtain)
- JavaScript控制页面元素显示隐藏
- VS2010 配置 OpengGL
- 浅谈事件与委托
- 解码 XML 和 DTD
- PowerPoint PIA中Application没有RecentFile属性的解决方案
- 写入结构数据 (Write from structure)
- C# 2.0 新特性