zoj 1005 Jugs

其实这道题目,我感觉就是一道数学题,仔细观察题目的规律可知,举例吧!就用题目中的这两个例子。

1,a b c

    3 5 4

那么如何可以得到4呢!2*b-2*a=2*5-2*3=4  即 (b-a)+(b-a)=4 正号可以看做满水,b-a可以看做是b的水倒向a 

2,a b c

  5  7 3

这个可以拆解为 2*a-b=3 即 2*5-7=3  

当然这只是第一步,得到每个那个壶先灌了几次水,那个壶向那个壶转了几次水。然后就可以推出倒了几次水。

剩下就简单了,考验你的分析能力了!!!

#include<stdio.h>
#include<stdlib.h>
int Max(int n,int i,int m,int j)
{
    if((i*n-j*m)>0) return n;
    else return m;    
}
int main(void)
{
    int i,j,n,m,v,t1,t2,max2,max1,l,t,flag;
    int x,y,ca,cb;
    char max,min;
    while(scanf("%d%d%d",&n,&m,&v)!=EOF)
    {
        if(m==v)
        {
            printf("fill B
");
            continue;
        }
        else if(n==v)
        {
            printf("fill A
");
            printf("pour A B
");
            continue;
        }
        else
        {
            for(t=1,i=1,j=1;1;t++)
        {
            if(abs(n*i-m*j)==v)
            break;
            if((n*i-m*j)>0)
            j++;
            else 
            i++;        
        }
        max1=Max(n,i,m,j);
        if(max1==n)/*谁先加水 */
        {
            t1=i;/*记录 */
            max2=m;t2=j;
            max='A';
            min='B';
        }
        else 
        {
            t1=j;
            max2=n,t2=i;
            min='A';
            max='B';
        }
        ca=cb=0;
        flag=0;
        for(l=1;l<=t1;l++)
        {
            /*每一次填充一个容器时都要判断加水的容器原来有没有水*/
            if(ca>0)
            {
                if((ca+cb)>=max2)
                {
                    printf("pour %c %c
",max,min);
                    printf("empty %c
",min);
                    printf("pour %c %c
",max,min);
                    cb=ca+cb-max2;
                    ca=0;
                }
                else
                {
                    printf("pour %c %c
",max,min);
                    cb=cb+ca;
                    ca=0;
                }
            }
            ca=max1;
            printf("fill %c
",max);
            if(t2||(cb>0&&cb<max2))
            {
                if((ca+cb)>=max2)
                 {
                     if((ca+cb-max2)==v&&max=='B')
                     {
                         printf("pour %c %c
",max,min);
                         flag=1;
                     }
                     else 
                     {
                     printf("pour %c %c
",max,min);
                    printf("empty %c
",min);
                    printf("pour %c %c
",max,min);
                    cb=ca+cb-max2;
                    ca=0;
                     }
                     
                     
                }
                else
                {
                    printf("pour %c %c
",max,min);
                    cb=ca+cb;
                    ca=0;
                }
            }
                
        }
        if(flag==1||(max=='B'&&ca==v)||(min=='B'&&cb==v))
        printf("success
");
        else if(min!='B'&&cb==v)
        {
        printf("pour %c %c
",min,max);
        printf("success
");
        }
        else if(max!='B'&&ca==v)
        {
        printf("pour %c %c
",min,max);
        printf("success
");
        }
        }
        
        
    }
    return 0;
}
原文地址:https://www.cnblogs.com/woshijishu3/p/3612186.html