【蓝桥杯】泊松分酒(穷举递归)

题目:

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

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

有3个容器,容量分别为12升,8升,5升。其中12升中装满油,另外两个空着。要求你只用3个容器操作,最后使得某个容器中正好有6升油。

只有b2瓶子为空时,b1才往b2瓶子里倒酒
只有瓶子b3为空时,b2才往b3瓶子里倒酒
只有瓶子b3为满时,b3才往b1瓶子里倒酒

#include<iostream>
using namespace std;
int b1=12;
int b2=8;
int b3=5;
int m=6;//目标酒量 
/*
bb1 the wine in b1 now
bb2 the wine in b2 now
bb3 the wine in b3 now
*/
void backBottle(int bb1,int bb2,int bb3)
{
	cout<<"bb1:"<<bb1<<" ";
	cout<<"bb2:"<<bb2<<" ";
	cout<<"bb3:"<<bb3<<endl;
	if(bb1 ==m || bb2 ==m || bb3 ==m)//分出目标酒量
	 {
			cout<<"ok"<<m;
			return;
		}
		if(bb2!=0&&bb3!=b3) //b3not enough
		{
			if(bb2+bb3<=b3) // if bb2+bb3<=b3,then put bb2 in bb3  go
			{
				backBottle(bb1,0,bb2+bb3);
			}else // if bb2+bb3>b3,then let bb2 -(b3-bb3) ,with b3 go 
			{
				backBottle(bb1,bb2-(b3-bb3),b3);
			}
		}else if(bb3 ==b3) //if now = target  begin put bb1 from bb3
		{
			if(bb3+bb1<=b1)//if sum(bb3+bb1)<=b1 
			{
				backBottle(bb1+bb3,bb2,0); //all of them put in b1
			}else //if b1 not enough space  
			{
				backBottle(b1,bb2,bb3-(b1-bb1));//use b3  to save the more wine
			}
		}else if(bb2==0) {
			if(bb1<=b2) {
				backBottle(0,bb1,bb3);
			}else {
				backBottle(bb1-b2,b2,bb2+bb3);
			}
		}
	}
int main()
{   int a,b,c;
    cin>>a;
    cin>>b;
    cin>>c;
	backBottle(a,b,c);
 } 
原文地址:https://www.cnblogs.com/AmosAlbert/p/12832327.html