博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法笔记_219:泊松分酒(Java)
阅读量:6853 次
发布时间:2019-06-26

本文共 4925 字,大约阅读时间需要 16 分钟。

目录

 


1 问题描述

泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布。

有一次闲暇时,他提出过一个有趣的问题,后称为:“泊松分酒”。在我国古代也提出过类似问题,遗憾的是没有进行彻底探索,其中流传较多是:“韩信走马分油”问题。

有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

每一行表示一个操作过程中的油量状态。

注意:

请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!

 

 

 


2 解决方案

1 import java.util.ArrayList;  2 import java.util.Scanner;  3   4 public class Main {  5     public static ArrayList
set = new ArrayList
(); 6 public static int[] maxN = new int[3]; 7 public static int[] N = new int[3]; 8 public static int ans; 9 public static int count = 0; 10 11 //某start瓶向end瓶中倒 12 public void getOnetoAnother(int start, int end) { 13 if(N[start] == 0) 14 return; 15 if(maxN[end] > N[end]) { 16 int low = maxN[end] - N[end]; 17 int temp1 = N[start], temp2 = N[end]; 18 if(low >= N[start]) { 19 N[end] = N[end] + N[start]; 20 N[start] = 0; 21 } else { 22 N[end] = maxN[end]; 23 N[start] = N[start] - low; 24 } 25 StringBuffer s = new StringBuffer(""); 26 s.append(N[0]); 27 s.append(","); 28 s.append(N[1]); 29 s.append(","); 30 s.append(N[2]); 31 if(!set.contains(s.toString())) { 32 set.add(s.toString()); 33 count++; 34 } else { 35 N[start] = temp1; 36 N[end] = temp2; 37 } 38 } 39 } 40 41 public boolean check() { 42 if(N[0] == ans || N[1] == ans || N[2] == ans) { 43 for(String s : set) 44 System.out.println(s); 45 return true; 46 } 47 return false; 48 } 49 50 public void getResult() { 51 int max = Math.max(maxN[0], Math.max(maxN[1], maxN[2])); 52 if(ans > max) { 53 System.out.println("不可能"); 54 return; 55 } 56 while(true) { 57 int temp = count; 58 //A瓶向B瓶倒 59 getOnetoAnother(0, 1); 60 if(check()) 61 break; 62 //B瓶向C瓶倒 63 getOnetoAnother(1, 2); 64 if(check()) 65 break; 66 //C瓶向A瓶倒 67 getOnetoAnother(2, 0); 68 if(check()) 69 break; 70 //A瓶向C瓶倒 71 getOnetoAnother(0, 2); 72 if(check()) 73 break; 74 //C瓶向B瓶倒 75 getOnetoAnother(2, 1); 76 if(check()) 77 break; 78 //B瓶向A瓶倒 79 getOnetoAnother(1, 0); 80 if(check()) 81 break; 82 temp = count - temp; 83 if(temp == 0) { 84 System.out.println("不可能"); 85 return; 86 } 87 } 88 } 89 90 public static void main(String[] args) { 91 Main test = new Main(); 92 Scanner in = new Scanner(System.in); 93 String S = in.next(); 94 String[] arrayS = S.split(","); 95 for(int i = 0;i < 3;i++) 96 maxN[i] = Integer.valueOf(arrayS[i]); 97 for(int i = 3;i < 6;i++) 98 N[i - 3] = Integer.valueOf(arrayS[i]); 99 ans = Integer.valueOf(arrayS[6]);100 StringBuffer s = new StringBuffer("");101 s.append(N[0]);102 s.append(",");103 s.append(N[1]);104 s.append(",");105 s.append(N[2]);106 set.add(s.toString());107 test.getResult();108 }109 }

 

 

运行结果:

测试用例1:12,8,5,12,0,0,612,0,04,8,04,3,59,3,09,0,37,0,57,5,02,5,52,8,210,0,210,2,05,2,55,7,00,7,50,8,48,0,48,4,03,4,53,8,111,0,111,1,06,1,5测试用例2:30,13,7,30,0,0,530,0,017,13,017,6,724,6,024,0,623,0,723,7,016,7,716,13,129,0,129,1,022,1,722,8,015,8,715,13,228,0,228,2,021,2,721,9,014,9,714,13,327,0,327,3,020,3,720,10,013,10,713,13,426,0,426,4,019,4,719,11,012,11,712,13,5测试用例3:31,19,11,31,0,0,531,0,012,19,012,8,1123,8,023,0,820,0,1120,11,09,11,119,19,328,0,328,3,017,3,1117,14,06,14,116,19,625,0,625,6,014,6,1114,17,03,17,113,19,922,0,922,9,011,9,1111,19,130,0,130,1,019,1,1119,12,08,12,118,19,427,0,427,4,016,4,1116,15,05,15,11测试用例4:65,33,12,65,0,0,1865,0,032,33,032,21,1244,21,044,9,1256,9,056,0,953,0,1253,12,041,12,1241,24,029,24,1229,33,362,0,362,3,050,3,1250,15,038,15,1238,27,026,27,1226,33,659,0,659,6,047,6,1247,18,0

 

转载地址:http://hyyyl.baihongyu.com/

你可能感兴趣的文章
UI设计时要注意的几个方面
查看>>
SVN 更新失败
查看>>
kmp循环节
查看>>
又撸了一上午的番
查看>>
学习笔记:Oracle 12C 数据非常规恢复工具bbed的使用说明
查看>>
保留CAAnimation执行后的效果
查看>>
第三方登录(QQ登录)开发流程详解
查看>>
Pwn2Own黑客大赛首日:Safari、IE8被攻破
查看>>
JSignature的使用
查看>>
批处理文件
查看>>
MySQL,Oracle,PostgreSQL,DB2,mongoDB,Hive, SAP HANA 数据库web维护客户端管理工具
查看>>
V-rep学习笔记:机器人模型创建1—模型简化
查看>>
cocos2dx simplegame 2 添加不同的怪物
查看>>
ios 开发中经常用到的 栏控件(bar)
查看>>
MySQL ibdata多路径扩容
查看>>
[差分][栈]JZOJ 4209 已经没有什么好怕的了awa
查看>>
2019寒假纪中总结
查看>>
DH02-策略模式
查看>>
poj 1094 Sorting It All Out
查看>>
配置Instantclient
查看>>