泊松分酒
泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布。
有一次闲暇时,他提出过一个有趣的问题,后称为:“泊松分酒”。在我国古代也提出过类似问题,遗憾的是没有进行彻底探索,其中流传较多是:“韩信走马分油”问题。
有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//A->B 1
4,3,5//B->C 2
9,3,0//C->A
9,0,3//B->C 4
1,8,3//A->B 5
1,6,5//B->C 6
每一行表示一个操作过程中的油量状态。
注意:
请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
1 #include<stdio.h> 2 #include<conio.h> 3 4 typedef struct 5 { 6 int size;//容器的大小 7 int yet;//已经装入的酒 8 int sy;//还可以装的量 9 }RongQi; 10 11 //倒酒功能:将A倒入B中 12 int fun(RongQi *A,RongQi *B) 13 { 14 if(B->yet==B->size) return 0; 15 if(A->yet>=B->sy)//如果A装的量比B还可以装的量大 ,则B装满了,A还有多的 16 { 17 A->yet=A->yet-B->sy; 18 A->sy=A->size-A->yet; 19 B->yet=B->size; 20 B->sy=0; 21 }else{// 果A装的量比B还可以装的量小 ,则B没装满,A为空 22 B->yet=B->yet+A->yet; 23 B->sy=B->size-B->yet; 24 A->yet=0;//A为空 25 A->sy=A->size; 26 } 27 return 1; 28 } 29 int main() 30 { 31 int key,flag=0; 32 RongQi A,B,C;//有A,B,C三个容器 33 scanf("%d,%d,%d,%d,%d,%d,%d",&A.size,&B.size,&C.size,&A.yet,&B.yet,&C.yet,&key); 34 if(A.yet<0||B.yet<0||C.yet<0||A.yet>A.size||B.yet>B.size||C.yet>C.size) 35 { 36 printf("不可能\n"); 37 return 0; 38 } 39 A.sy=A.size-A.yet; 40 B.sy=B.size-B.yet; 41 C.sy=C.size-C.yet; 42 for(int i=1;;i++) 43 { 44 printf("%d,%d,%d\n",A.yet,B.yet,C.yet);//输出 45 if(i%2==0) 46 { 47 flag=fun(&B,&C);//B到C 48 }else if(i%4==1) { 49 flag=fun(&A,&B);//A到B 50 }else{ 51 flag=fun(&C,&A);//C到A 52 } 53 if(A.yet==key||B.yet==key||C.yet==key) 54 { 55 printf("%d,%d,%d\n分酒成功\n",A.yet,B.yet,C.yet); 56 break; 57 }else if(flag==0||(A.yet<0||B.yet<0||C.yet<0)){ 58 printf("不可能\n"); 59 break; 60 } 61 } 62 getch(); 63 return 0; 64 }

浙公网安备 33010602011771号