其实这道题目,我感觉就是一道数学题,仔细观察题目的规律可知,举例吧!就用题目中的这两个例子。
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; }