• 蓝桥杯 第十题 分酒



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

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

        有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

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

       注意:

        请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
       
        请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
       
        相关的工程文件不要拷入。
       
        请不要使用package语句。
       
        源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。 
       
       

    import java.io.*;
    import java.util.*;
    class Node{
    	int max[];
    	int v[];
    	Node(){
    		max=new int[3];
    		v=new int[3];
    	}
    	public Node getNode(){
    		Node node=new Node();
    		for(int i=0;i<3;i++){
    			node.max[i]=max[i];
    			node.v[i]=v[i];
    		}
    		return node;
    	}
    }
    /*
     * @author denghuilong 
     *  
     * 2013-8-13下午4:14:55
     *
    */
    public class A10_1 {
    	public boolean boo[]=new boolean[100*100*100+100*100+100];
    	public Queue<Node> list=new LinkedList<Node>();
    	public LinkedList<String> li;
    	public int end;
    	public static void main(String[] args) {
    		new A10_1().work();
    	}
    	public void work(){
    		Scanner sc=new Scanner(new BufferedInputStream(System.in));
    			Arrays.fill(boo,false);
    			list.clear();
    			String s=sc.nextLine();
    			String str[]=s.split(",");
    			Node node=new Node();
    			for(int i=0;i<3;i++){
    				node.max[i]=Integer.parseInt(str[i]);
    			}
    			int j=0;
    			for(int i=3;i<6;i++){
    				node.v[j++]=Integer.parseInt(str[i]);
    			}
    			end=Integer.parseInt(str[6]);
    			list.add(node);
    			BFS();
    	}
    	public void BFS(){
    		li=new LinkedList<String>();
    		while(list.size()!=0){
    			Node node=list.poll();
    			for(int i=0;i<3;i++){
    				for(int j=0;j<3;j++){
    					if(i==j||node.max[j]==node.v[j])
    						continue;
    					Node t=node.getNode();
    					if(t.v[i]>=(t.max[j]-t.v[j])){
    						t.v[i]=t.v[i]-(t.max[j]-t.v[j]);
    						t.v[j]=t.max[j];
    					}
    					else{
    						t.v[j]=t.v[i]+t.v[j];
    						t.v[i]=0;
    					}
    					int step=getStep(t);
    					if(!boo[step]){
    						boo[step]=true;
    						list.add(t);
    						li.addLast(getString(t));
    						if(check(t)){
    							for(int k=0;k<li.size();k++){
    								System.out.println(li.get(k));
    							}
    							return;
    						}
    					}
    				}
    			}
    		}
    		System.out.println("不可能");
    	}
    	public String getString(Node node){
    		return ""+node.v[0]+","+node.v[1]+","+node.v[2];
    	}
    	public int getStep(Node node){
    		return node.v[0]*100*100+node.v[1]*100+node.v[2];
    	}
    	public boolean check(Node node){
    		int s=node.v[0];
    		int m=node.v[1];
    		int n=node.v[2];
    		if((s==end)||(m==end)||(n==end))
    			return true;
    		else
    			return false;
    	}
    }
    


     


       

  • 相关阅读:
    简单明了的带你理解springboot原理和三大核心注解
    Spring Boot(一):入门篇
    【Mysql优化】聚簇索引与非聚簇索引概念
    Mysql索引原理与优化
    Mysql全文索引的使用
    索引的优缺点,如何创建索引
    184 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 04 例:字符串与byte(即:字节)数组间的相互转换
    183 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 03 String常用方法(下)
    182 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 02 String常用方法(上)
    181 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 01 String常用方法简介
  • 原文地址:https://www.cnblogs.com/bbsno1/p/3260556.html
Copyright © 2020-2023  润新知