泊松汾酒


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

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

有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

每一行表示一个操作过程中的油量状态。

 

 

 1 #include<stdio.h>
 2 #include<queue>
 3 #include<string.h>
 4 
 5 using namespace std;
 6 
 7 typedef struct node
 8 {
 9     int v[3];
10     int deep;
11     int fa;
12 }node;
13 node q[100];
14 int vis[100][100];
15 int a[3];
16 int a1,a3,a2,t;
17 void prin(int x)
18 {
19     if(q[x].fa!=x)
20         prin(q[x].fa);
21     printf("%d %d %d\n",q[x].v[0],q[x].v[1],q[x].v[2]);
22 }
23 int  dfs()
24 {
25     int i,j,k,r,f;
26     node x,y;
27     x.v[0]=a1; x.v[1]=a2;x.v[2]=a3;x.fa=0;x.deep=0;
28     r=1;
29     f=0;
30     q[0]=x;
31     while(r>f)
32     {
33         x=q[f];
34         if(x.v[0]==t||x.v[1]==t||x.v[2]==t)  
35         {
36             printf("%d\n",x.deep);
37             prin(f);
38             return 1;
39         }
40         for(i=0;i<3;i++)
41             for(j=0;j<3;j++)
42             {
43                 if(i==j) continue;
44                 k=x.v[i]<a[j]-x.v[j]?x.v[i]:a[j]-x.v[j];
45                 y=x;
46                 y.v[i]-=k;
47                 y.v[j]+=k;
48                 y.deep++;
49                 y.fa=f;
50                 if(!vis[y.v[1]][y.v[2]])
51                 {
52                     vis[y.v[1]][y.v[2]]=1;
53                     q[r++]=y;
54                 }
55             }
56         f++;
57     }
58     printf("不可能\n");
59     return 1;
60 
61 }
62 
63 
64 
65 int main()
66 {
67     scanf("%d,%d,%d,%d,%d,%d,%d",&a[0],&a[1],&a[2],&a1,&a2,&a3,&t);
68     dfs();
69     return 0;
70 }

 

posted @ 2013-05-19 16:41  萧凡客  阅读(885)  评论(0编辑  收藏  举报