uva 10603 Fill(倒水问题 BFS)

来源:互联网 发布:淘宝旺信 编辑:程序博客网 时间:2024/06/05 16:37

貌似uva崩了,现在进不去,所以这道题还判断正确与否,其实无所谓了,我这是看的网上的代码,写的基本上一样,唉,没办法,不会做,又看了网上的题解,认真写理解吧还是。。。

构造了一个结构体,water数组用来保存三个杯子的状态,sum用来保存当前的倒水量,visit数组用来保存状态,以

防他们重复访问,三个杯子只需要两个杯子来判断,第三个已经确定,所以开一个二维数组就可以了。。。然后用

reach数组来存储所有的倒水量,下标是目标水量,值是一共的倒水量。。。

只需要一次BFS最多有200*200种状态,然后从这些状态中找到想要求的目标水量对应的到水量就可以了。。。

二维数组来判断是否重复是个好方法,只可惜我没想出来,。。。。继续加油!!!

另外还出了点bug,找了一上午。。。原来是优先级问题,if语句里面的,以后都老老实实加括号算了。。。

代码:

<span style="font-family:Courier New;font-size:18px;">#include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>using namespace std;int visit[205][205];int reach[205];int a[3];struct state{int water[3];int sum;}stt,st2;void solve(){for(int k=0; k<3; k++){if(reach[st2.water[k]] == -1)reach[st2.water[k]] = st2.sum;else if(reach[st2.water[k]] > st2.sum)reach[st2.water[k]] = st2.sum;}return ;}void bfs(){state st1;int i,j;st1.water[0] = 0;st1.water[1] = 0;st1.water[2] = a[2];st1.sum = 0;reach[0] = reach[a[2]] = 0;visit[0][0] = 1;queue<state>que;que.push(st1);while(!que.empty()){stt = que.front();que.pop();for(i=0; i<3; i++){for(j=0; j<3; j++){if(i == j)continue;st2 = stt;int m = a[j] - stt.water[j] > stt.water[i] ? stt.water[i] : a[j] - stt.water[j];st2.water[i] = stt.water[i] - m;st2.water[j] =  stt.water[j] + m;if(!visit[st2.water[0]][st2.water[1]] || reach[st2.water[0]] > (stt.sum + m) || reach[st2.water[1]] > (stt.sum +m )|| reach[st2.water[2]] >(stt.sum +m)){visit[st2.water[0]][st2.water[1]] = 1;st2.sum = stt.sum + m;solve();que.push(st2);}}}}return ;}int main(){int T,ans;scanf("%d",&T);while(T--){scanf("%d%d%d%d",&a[0],&a[1],&a[2],&ans);memset(visit,0,sizeof(visit));memset(reach,-1,sizeof(reach));bfs();for(int i=ans; i>=0; i--){if(reach[i] >= 0){printf("%d %d\n",reach[i],i);break;}}}return 0;}</span>

uva好了,已经A了

0 0
原创粉丝点击