泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布。
有一次闲暇时,他提出过一个有趣的问题,后称为:“泊松分酒”。在我国古代也提出过类似问题,遗憾的是没有进行彻底探索,其中流传较多是:“韩信走马分油”问题。
有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.util.*;
public class Main {
static int a,b,c;
static String str2="";
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String str1=input.nextLine();
String []s1=str1.split(",");
a=Integer.parseInt(s1[0]);
b=Integer.parseInt(s1[1]);
c=Integer.parseInt(s1[2]);
int a1=Integer.parseInt(s1[3]);
int b1=Integer.parseInt(s1[4]);
int c1=Integer.parseInt(s1[5]);
int result=Integer.parseInt(s1[6]);
if (a1+b1+c1>=result)
{
bosong(a1,b1,c1,result);
}
else
{
System.out.println("不可能");
}
}
private static void bosong(int a1, int b1, int c1,int result) {
String s2=a1+","+b1+","+c1;
System.out.println(s2);
if (str2.contains(s2))
{
System.out.println("不可能");
return;
}
str2+="["+s2+"]";
if (a1==result||b1==result||c1==result)
{
return;
}
if (c1==0&&b1!=0)
{
bosong(a1,b1>c?b1-c:0,b1>c?c:b1,result);
}
else
{
if (c1==c)
{
bosong(a-a1>c?a1+c:a,b1,a-a1>c?0:a1+c-a,result);
}
else{
if (a1!=0&&b1!=b)
{
bosong(a1>b-b1?a1-b+b1:0,a1>b-b1?b:a1+b1,c1,result);
}
else
{
if (b1!=0&&c1!=c)
{
bosong(a1,b1>c-c1?b1-c+c1:0,b1>c-c1?c:b1+c1,result);
}
else
{
System.out.println("不可能");
}
}
}
}
}
}
运行结果:
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