三个水杯

来源:互联网 发布:裤哥大战淘宝店主 编辑:程序博客网 时间:2024/04/27 00:16

三个水杯

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
样例输入
26 3 14 1 19 3 27 1 1
样例输出
3

-1


这道题刚开始以为是模拟,但实在是模拟不出来,分析得到,才只有三个杯子,那么倒得情况就只有六种,这和之前做过的一道由一个奇数变换几次可以得到另外一个指定的奇数类似。这两道题都有一个地方我没有想到,导致了TLE和WA,我没有VIS数组标记广搜过得状态,奇数那道题出现了无限循环的现象,这道题出现了无法判定广搜结束的条件,我之前那个判断广搜结束的条件有问题,所以以后再做广搜的题,一定要记得VIS标记数组的使用。这道题我之前一直RUN time ERRO,问题不出在数组越界什么的,而是我的倒得时候的判断没有考虑周全,这道题我觉得对于考验思维能力很有帮助。


#include<iostream>#include<queue>#include<string.h>#include<stdlib.h> #include<stdio.h>using namespace std;int N,V1,V2,V3,E1,E2,E3;struct node{int a;int b;int c;int step;};int vis[110][110][110];queue<node> que;void BFS(){int i,j,k;/*for(i=0;i<110;i++)for(j=0;j<110;j++)for(k=0;k<110;k++)vis[i][j][k]=0; */memset(vis,0,sizeof(vis));struct node start,temp;start.a=V1;start.b=0;start.c=0;start.step=0;vis[V1][0][0]=1;que.push(start);while(!que.empty()){start=que.front();que.pop();if(start.a==E1 && start.b==E2 && start.c==E3){printf("%d\n",start.step);return ;}//1倒给2if(start.a-(V2-start.b)>=0) //可以倒  这里需要注意够不够倒 {temp.a=start.a-(V2-start.b);temp.b=V2;temp.c=start.c;temp.step=start.step+1;if(vis[temp.a][temp.b][temp.c]==0){vis[temp.a][temp.b][temp.c]=1;que.push(temp);}}else{temp.a=0;temp.b=start.b+start.a;temp.c=start.c;temp.step=start.step+1;if(vis[temp.a][temp.b][temp.c]==0){vis[temp.a][temp.b][temp.c]=1;que.push(temp);}}//1倒给3 if(start.a-(V3-start.c)>=0){temp.a=start.a-(V3-start.c);temp.b=start.b;temp.c=V3;temp.step=start.step+1;if(vis[temp.a][temp.b][temp.c]==0){vis[temp.a][temp.b][temp.c]=1;que.push(temp);}}else{temp.a=0;temp.b=start.b;temp.c=start.a+start.c;temp.step=start.step+1;if(vis[temp.a][temp.b][temp.c]==0){vis[temp.a][temp.b][temp.c]=1;que.push(temp);}}//2倒给1if(start.b-(V1-start.a)>=0){temp.a=V1;temp.b=start.b-(V1-start.a);temp.c=start.c;temp.step=start.step+1;if(vis[temp.a][temp.b][temp.c]==0){vis[temp.a][temp.b][temp.c]=1;que.push(temp);}}else{temp.a=start.a+start.b;temp.b=0;temp.c=start.c;temp.step=start.step+1;if(vis[temp.a][temp.b][temp.c]==0){vis[temp.a][temp.b][temp.c]=1;que.push(temp);}}//2倒给3 if(start.b-(V3-start.c)>=0){temp.a=start.a;temp.b=start.b-(V3-start.c);temp.c=V3;temp.step=start.step+1;if(vis[temp.a][temp.b][temp.c]==0){vis[temp.a][temp.b][temp.c]=1;que.push(temp);}}else{temp.a=start.a;temp.b=0;temp.c=start.b+start.c;temp.step=start.step+1;if(vis[temp.a][temp.b][temp.c]==0){vis[temp.a][temp.b][temp.c]=1;que.push(temp);}}//3倒给1if(start.c-(V1-start.a)>=0){temp.a=V1;temp.b=start.b;temp.c=start.c-(V1-start.a);temp.step=start.step+1;if(vis[temp.a][temp.b][temp.c]==0){vis[temp.a][temp.b][temp.c]=1;que.push(temp);}}else{temp.a=start.a+start.c;temp.b=start.b;temp.c=0;temp.step=start.step+1;if(vis[temp.a][temp.b][temp.c]==0){vis[temp.a][temp.b][temp.c]=1;que.push(temp);}}//3倒给2 if(start.c-(V2-start.b)>=0){temp.a=start.a;temp.b=V2;temp.c=start.c-(V2-start.b);temp.step=start.step+1;if(vis[temp.a][temp.b][temp.c]==0){vis[temp.a][temp.b][temp.c]=1;que.push(temp);}}else{temp.a=start.a;temp.b=start.b+start.c;temp.c=0;temp.step=start.step+1;if(vis[temp.a][temp.b][temp.c]==0){vis[temp.a][temp.b][temp.c]=1;que.push(temp);}}}printf("-1\n");}int main(){scanf("%d",&N);while(N--){scanf("%d %d %d",&V1,&V2,&V3);scanf("%d %d %d",&E1,&E2,&E3);while(!que.empty()) que.pop();BFS();}return 0;}        


0 0