三个水杯
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
-
输入
-
第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
- 每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1 样例输入
-
2 6 3 1 4 1 1 9 3 2 7 1 1
样例输出
-
3 -1
-
-
//很久以前不会的题目 今天看了才知道原来是广搜....
-
//AC代码 自己写得不臭但很长 很好理解..
-
#include <iostream> #include <cstdio> #include <queue> #include <string.h> const int N=105; using namespace std; int V1,V2,V3; int re1,re2,re3; struct Now{ int a,b,c,step; }now,tmp; queue<Now> q; bool book[N][N][N]; int main(){ int t,i,j,k; scanf("%d",&t); while(t--){ while(!q.empty()) q.pop(); scanf("%d%d%d",&V1,&V2,&V3); scanf("%d%d%d",&re1,&re2,&re3); for(i=0;i<=V1;i++) for(j=0;j<=V2;j++) for(k=0;k<=V3;k++) book[i][j][k]=0; now.a=V1; now.b=0; now.c=0; now.step=0; q.push(now); book[V1][V2][V3]=1; bool ok=0; while(!q.empty()){ now=q.front(); if(now.a==re1&&now.b==re2&&now.c==re3){ ok=1; break; } q.pop(); //a->b if(now.b<V2){ //B没满 if(now.a>=(V2-now.b)){ i=now.a-(V2-now.b); j=V2; } else{ i=0; j=now.b+now.a; } k=now.c; if(book[i][j][k]!=1){ book[i][j][k]=1; tmp.a=i; tmp.b=j; tmp.c=k; tmp.step=now.step+1; q.push(tmp); } } //a->c if(now.c<V3){ if(now.a>=(V3-now.c)){ i=now.a-(V3-now.c); k=V3; } else{ i=0; k=now.a+now.c; } j=now.b; if(book[i][j][k]!=1){ book[i][j][k]=1; tmp.a=i; tmp.b=j; tmp.c=k; tmp.step=now.step+1; q.push(tmp); } } //b->a if(now.a<V1){ if(now.b>=(V1-now.a)){ j=now.b-(V1-now.a); i=V1; } else{ j=0; i=now.b+now.a; } k=now.c; if(book[i][j][k]!=1){ book[i][j][k]=1; tmp.a=i; tmp.b=j; tmp.c=k; tmp.step=now.step+1; q.push(tmp); } } //b->c if(now.c<V3){ if(now.b>=(V3-now.c)){ j=now.b-(V3-now.c); k=V3; } else{ j=0; k=now.b+now.c; } i=now.a; if(book[i][j][k]!=1){ book[i][j][k]=1; tmp.a=i; tmp.b=j; tmp.c=k; tmp.step=now.step+1; q.push(tmp); } } //c->a if(now.a<V1){ if(now.c>=(V1-now.a)){ k=now.c-(V1-now.a); i=V1; } else{ k=0; i=now.c+now.a; } j=now.b; if(book[i][j][k]!=1){ book[i][j][k]=1; tmp.a=i; tmp.b=j; tmp.c=k; tmp.step=now.step+1; q.push(tmp); } } //c->b if(now.b<V2){ if(now.c>=(V2-now.b)){ k=now.c-(V2-now.b); j=V2; } else{ k=0; j=now.b+now.c; } i=now.a; if(book[i][j][k]!=1){ book[i][j][k]=1; tmp.a=i; tmp.b=j; tmp.c=k; tmp.step=now.step+1; q.push(tmp); } } } if(ok) printf("%d\n",now.step); else printf("-1\n"); } return 0; }
-
-
第一行一个整数N(0<N<50)表示N组测试数据