每日一题 隐式图 倒水问题

来源:互联网 发布:洗车哪个软件好 编辑:程序博客网 时间:2024/05/22 01:34

很久没有做题了,慢慢熟悉起来吧!ACM不可间断,唉唉唉唉

有三个无刻度标志的水杯,分别可装 a ,b , c升水,并且a>b , a>c , a,b,c,均为正整数。任意两个水杯之间可以相互倒水。用

 
杯子x给y倒水的时必须一直持续到把杯子y倒满或者把杯子x倒空,而不能中途停止。倒水过程中水量不变。最初的时候只有大杯子
 
装满水,其他两个杯子为空。问能不能量出x升水,如果可以,最少需要多少步?
#include<stdio.h>#include<string.h>#define MAXN 4000int a, b, c, x;char v[1010][1010];typedef struct pub{int a,b,c;int num;pub(){num = 0;}} pub;pub d[MAXN];void bfs(){int front = 0, rear = 1;while(rear > front){//printf("111111111111111111111\n");if(d[front].a > 0 && d[front].b < b && !v[d[front].a][d[front].b])//a yu b huan{d[rear].num = d[front].num + 1;if(d[front].a > b-d[front].b){d[rear].a = d[front].a - (b-d[front].b);d[rear].c = d[front].c;d[rear++].b = b;}else{d[rear].a = 0;d[rear].c = d[front].c;d[rear++].b = d[front].b + d[front].a; }//printf("a=%d b=%d c=%d  \n ",d[rear-1].a,d[rear-1].b,d[rear-1].c);if(d[front].a==x || d[front].b==x || d[front].c==x) break;}if(d[front].a > 0 && d[front].c < c && !v[d[front].a][d[front].b])//a yu c huan{d[rear].num = d[front].num + 1;if(d[front].a > c-d[front].c){d[rear].a = d[front].a - (c-d[front].c);d[rear].b = d[front].b;d[rear++].c = c;}else{d[rear].a = 0;d[rear].b = d[front].b;d[rear++].c = d[front].c + d[front].a; }//printf("a=%d b=%d c=%d   \n",d[rear-1].a,d[rear-1].b,d[rear-1].c);if(d[front].a==x || d[front].b==x || d[front].c==x) break;}if(d[front].b > 0 && d[front].a < a && !v[d[front].a][d[front].b])//b yu a huan{d[rear].num = d[front].num + 1;if(d[front].b > a-d[front].a){d[rear].b = d[front].b - (a-d[front].a);d[rear].c = d[front].c; d[rear++].a = a;}else{d[rear].b = 0;d[rear].c = d[front].c;d[rear++].a = d[front].a + d[front].b; }//printf("a=%d b=%d c=%d  \n ",d[rear-1].a,d[rear-1].b,d[rear-1].c);if(d[front].a==x || d[front].b==x || d[front].c==x) break;}if(d[front].b > 0 && d[front].c < c && !v[d[front].a][d[front].b])//b yu c huan{d[rear].num = d[front].num + 1;if(d[front].b > c-d[front].c){d[rear].b = d[front].b - (c-d[front].c);d[rear].a = d[front].a;d[rear++].c = c;}else{d[rear].b = 0;d[rear].a = d[front].a;d[rear++].c = d[front].c + d[front].b; }//printf("a=%d b=%d c=%d   \n",d[rear-1].a,d[rear-1].b,d[rear-1].c);if(d[front].a==x || d[front].b==x || d[front].c==x) break;}if(d[front].c > 0 && d[front].a < a && !v[d[front].a][d[front].b])//c yu a huan{d[rear].num = d[front].num + 1;if(d[front].c > a-d[front].a){d[rear].c = d[front].c - (a-d[front].a);d[rear].b = d[front].b;d[rear++].a = a;}else{d[rear].c = 0;d[rear].b = d[front].b;d[rear++].a = d[front].a + d[front].c; }//printf("a=%d b=%d c=%d   \n",d[rear-1].a,d[rear-1].b,d[rear-1].c);if(d[front].a==x || d[front].b==x || d[front].c==x) break;}if(d[front].c > 0 && d[front].b < b && !v[d[front].a][d[front].b])//c yu b huan{d[rear].num = d[front].num + 1;if(d[front].c > b-d[front].b){d[rear].c = d[front].c - (b-d[front].b);d[rear].a = d[front].a;d[rear++].b = b;}else{d[rear].c = 0;d[rear].a = d[front].a;d[rear++].b = d[front].c + d[front].b; }//printf("a=%d b=%d c=%d\n",d[rear-1].a,d[rear-1].b,d[rear-1].c);if(d[front].a==x || d[front].b==x || d[front].c==x) break;}v[d[front].a][d[front].b] = 1;//printf("hvis=%d\n",front);front ++;//puts("");}if(front >= rear) printf("-1\n");else printf("%d\n",d[rear-1].num - 1);}void init(){while(~scanf("%d%d%d%d",&a,&b,&c,&x)){memset(v,0,sizeof(v));d[0].a = a;d[0].b = 0;d[0].c = 0;bfs();}}int main(){init();return 0;}

  

0 0
原创粉丝点击