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
- uva 10603 Fill(倒水问题 BFS)
- Fill (Uva 10603 bfs 倒水问题)
- UVA 10603 Fill(倒水问题)
- UVA-10603 Fill 倒水问题 BFS+优先队列
- UVA 10603 Fill倒水问题
- 倒水问题(Fill,UVa 10603)
- 倒水问题(Fill,UVa 10603)
- 10603 - Fill,倒水问题 bfs解
- 例题7-8 倒水问题(Fill, UVa 10603)
- UVa 10603 - Fill,经典倒水问题+隐式图搜索+dfs
- 例题7-8 UVA 10603 Fill 倒水问题
- UVA 10603 Fill(状态空间搜索,倒水问题)
- uva 10603 Fill (BFS)
- UVa 10603:Fill(BFS)
- uva 10603 倒水 bfs
- uva 10603 - Fill bfs
- UVA 10603 - Fill BFS~
- UVA 10603 Fill【BFS】
- 《记录我在无线互联的学习生涯——连载一》
- 由一道淘宝面试题到False sharing问题
- 无限互联ios学习连载(二)
- poj解题报告——2262
- Android 实践 7-24
- uva 10603 Fill(倒水问题 BFS)
- [LeetCode]Number of Digit One,解题报告
- HDOJ 1873 看病要排队(优先队列)
- JS中location.href页面跳转粗解
- maven 之nexus
- 通过Node-WebKit用html5开发桌面应用(安装+打包)
- android 实践 7/25
- Spring之Bean 生命周期
- EL表达式获取日期时间类型后格式化的问题