2016蓝桥杯假期任务之《泊松汾酒》

本文介绍了一个有趣的数学问题——泊松分酒,探讨如何仅使用容量为12升、8升和5升的三个容器,通过倒腾油来得到恰好6升油的方法。文章提供了一段Java程序代码,用于解决类似问题,并展示了具体的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

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

    有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


    
    
   


   





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值