• 泊松汾酒



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

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

    有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 }
  • 相关阅读:
    redis数据结构
    django内置密码原理
    生成图片验证码
    如何封装VUE的axios请求
    杭电1717小数化分数2
    杭电2504 又见GCD
    杭电 2136 Largest prime factor(最大素数因子的位置)
    Linux终端的一些快捷键命令
    杭电 1772 cake
    杭电ACM 1713 相遇周期
  • 原文地址:https://www.cnblogs.com/xiaofanke/p/3086952.html
Copyright © 2020-2023  润新知