泊松分酒


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

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

    有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 } 



    
    


   

posted @ 2013-05-04 08:18  浪浪辛  阅读(377)  评论(0)    收藏  举报