分酒

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

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

    有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 block
			e.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;
    	}
    }
    
}



                
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值