`
lynnlysh
  • 浏览: 176295 次
  • 性别: Icon_minigender_2
  • 来自: 天津
社区版块
存档分类
最新评论

java实现分酒(泊松分酒)

阅读更多
写在前面:
泊松分酒:
法国著名数学家波瓦松在青年时代研究过一个有趣的数学问题:假设某人有12品脱的啤酒一瓶,想从中倒出六品脱,但是恰巧身边没有6品脱的容器,仅有一个8品脱和一个5品脱的容器,怎样倒才能将啤酒分为两个6品脱呢?现在,请你设计一个程序,可以根据输入的满瓶容量(a),和两个空瓶的容量(b和c)对倒,获得最终需要的容量(d)。
上周考笔试,有道题可能出现,想了N久也不会。最后考试中虽然没考它,但是突然就想明白了。
	/**
	 * @discription 酒瓶是8升酒,有两个杯,分别为3升和5升,现在想得到两杯4升的酒。
	 * 肿么分这瓶酒啊?
	 */
	void text(){
		fenjiu(8,5,3,4);
                fenjiu(12,8,5,6);
	}

	/***
	 * 倒酒方法
	 * @param i 盛酒
	 * @param j 倒酒
	 * @param wine 三个容器中酒量的数组
	 * @param cup 酒瓶和两个杯子容量的数组
	 * @param sunxu 酒瓶和两个杯子顺序的数组
	 * @param N 循环次数
	 * @param d 要得到的酒量
	 * @return
	 */
	int daoba(int i,int j,int[]wine,int[]cup,int[]sunxu,int N,int d){
		int k = 3-i-j;
		if(wine[k]==0&&wine[i]!=0&&(wine[i]<cup[k]||wine[i]==cup[k])){
			wine[k]=wine[i];
			wine[i]=0;
			System.out.println("第"+sunxu[i]+"杯"+"倒, 第"+sunxu[k]+"杯");
			System.out.println(wine[0]+" "+wine[1]+" "+wine[2]);
		}
		System.out.println("第"+sunxu[j]+"杯"+"到, 第"+sunxu[i]+"杯");
		//第一杯不接满,第二杯倒空
		if(wine[j]+wine[i]<cup[i]){
			wine[i]+=wine[j];
			wine[j]=0;
			System.out.println(wine[0]+" "+wine[1]+" "+wine[2]);
			if(wine[i]==d&&wine[k]==d){
				N=1000;
				return N;
			}
		//第一杯接满,第二杯不到空
		}else if(wine[j]-cup[i]+wine[i]>0){
			
			wine[j]=wine[j]-cup[i]+wine[i];
			wine[i]=cup[i];
			System.out.println(wine[0]+" "+wine[1]+" "+wine[2]);
			if(wine[k]==d&&wine[j]==d){
				N=1000;
				return N;
			}
			//第一杯接满,第二杯倒空	
		}else if(wine[j]+wine[i]==cup[i]){
			wine[i]=cup[i];
			wine[j]=0;
			System.out.println(wine[0]+" "+wine[1]+" "+wine[2]);
			
		}
		
		return N;
	}


	/**
	 * 分酒方法
	 * 1.先将杯子排序,大杯子放前面,小杯子放后面
	 * 2.酒瓶的酒先倒入大杯子
	 * 3.大杯子的酒倒入小杯子
	 * 4.小杯子酒倒入瓶中
	 * 5.如果大杯子有酒,那么将其倒入小杯子后再将瓶中酒倒入大杯子
	 * 6.重复此过程,直到其中两个容器中都有d升酒
	 * @param a 酒瓶容量
	 * @param b 第一个杯子
	 * @param c 第二个杯子
	 * @param d 要得到的酒量
	 */
	void fenjiu(int a,int b,int c,int d){
		int wine[]={a,0,0};
		int cup[]={a,b,c};
		int sunxu[]={1,2,3};
		int N = 0;
		int timeO = 0;//执行次数
		//排列杯子
		if(cup[1]<cup[2]){
			cup[1]=c;
			cup[2]=b;
			sunxu[2]=2;
			sunxu[1]=3;
		}
		while(N!=1000&&timeO<10000){
			for(int i=0;i<3;i++){
				int j = i+1;
				if(j>2){
					j=0;
				}
				if(wine[i]!=0&&wine[j]!=cup[j]){
					N = daoba(j,i,wine,cup,sunxu,N,d);
				}
				timeO++;
			}
		
		}
		
	System.out.println(timeO);
		}

写在后面:
后来网上搜,正解,也就是最优解是通过广度搜索算法得到的。
这个,等有灵感了再写。
突然觉得算法也挺好玩儿的啊!
*****************************格叽格叽*****************************
“好男人不会让心爱的女人受一点点伤”————张赫宣唱的真不错!是吧?lysh
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics