USACO Mother's Milk(bfs)
2015-07-19 12:40
441 查看
题目请点我
题解:
水杯倒水的问题很经典,套路也是一样的,bfs找出所有状态。这道题的关键在于每次都应该进行六次的倒水尝试,细心一点。PS:三维数组表示状态真的很方便。
代码实现:
题解:
水杯倒水的问题很经典,套路也是一样的,bfs找出所有状态。这道题的关键在于每次都应该进行六次的倒水尝试,细心一点。PS:三维数组表示状态真的很方便。
代码实现:
/* ID: eashion LANG: C++ TASK: milk3 */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include <algorithm> #define MAX 22 using namespace std; struct state{ int a,b,c; }; int A,B,C; int save[MAX]; queue<state> Q; int show[MAX][MAX][MAX]; int main() { freopen("milk3.in","r",stdin); freopen("milk3.out","w",stdout); while( scanf("%d%d%d",&A,&B,&C) != EOF ){ int pos = 0; memset(save,0,sizeof(save)); memset(show,0,sizeof(show)); show[0][0][C] = 1; state tmp; tmp.a = 0; tmp.b = 0; tmp.c = C; Q.push(tmp); while( !Q.empty() ){ state cur; cur = Q.front(); Q.pop(); if( cur.a == 0 ){ save[pos] = cur.c; pos++; } state nstate; int ta,tb,tc; if( cur.a != 0 ){ ta = cur.a; tb = cur.b; tc = cur.c; if( ta+tb <= B ){ tb += ta; ta = 0; tc = cur.c; } else{ ta = ta+tb-B; tb = B; tc = cur.c; } if( show[ta][tb][tc] != 1 ){ nstate.a = ta; nstate.b = tb; nstate.c = tc; Q.push(nstate); show[ta][tb][tc] = 1; } ta = cur.a; tb = cur.b; tc = cur.c; if( ta+tc <= C ){ tc += ta; ta = 0; tb = cur.b; } else{ ta = ta+tc-C; tc = C; tb = cur.b; } if( show[ta][tb][tc] != 1 ){ nstate.a = ta; nstate.b = tb; nstate.c = tc; Q.push(nstate); show[ta][tb][tc] = 1; } } if( cur.b != 0 ){ ta = cur.a; tb = cur.b; tc = cur.c; if( ta+tb <= A ){ ta += tb; tb = 0; tc = cur.c; } else{ tb = ta+tb-A; ta = A; tc = cur.c; } if( show[ta][tb][tc] != 1 ){ nstate.a = ta; nstate.b = tb; nstate.c = tc; Q.push(nstate); show[ta][tb][tc] = 1; } ta = cur.a; tb = cur.b; tc = cur.c; if( tb+tc <= C ){ tc += tb; tb = 0; ta = cur.a; } else{ tb = tb+tc-C; tc = C; ta = cur.a; } if( show[ta][tb][tc] != 1 ){ nstate.a = ta; nstate.b = tb; nstate.c = tc; Q.push(nstate); show[ta][tb][tc] = 1; } } if( cur.c != 0 ){ ta = cur.a; tb = cur.b; tc = cur.c; if( tc+tb <= B ){ tb += tc; tc = 0; ta = cur.a; } else{ tc = tc+tb-B; tb = B; ta = cur.a; } if( show[ta][tb][tc] != 1 ){ nstate.a = ta; nstate.b = tb; nstate.c = tc; Q.push(nstate); show[ta][tb][tc] = 1; } ta = cur.a; tb = cur.b; tc = cur.c; if( ta+tc <= A ){ ta += tc; tc = 0; tb = cur.b; } else{ tc = ta+tc-A; ta = A; tb = cur.b; } if( show[ta][tb][tc] != 1 ){ nstate.a = ta; nstate.b = tb; nstate.c = tc; Q.push(nstate); show[ta][tb][tc] = 1; } } } sort(save,save+pos); for( int i = 0; i < pos; i++ ){ if( i != pos-1 ){ printf("%d ",save[i]); } else{ printf("%d\n",save[i]); } } } return 0; }
相关文章推荐
- Surrounded Regions
- Word Ladder, Gray Code
- Hdu2444二分图
- 最少步数BFS
- 转v_JULY_v的 BFS和DFS优先搜索算法
- 2015 寒假搜索专题 I - Meteor Shower(BFS)
- Same Tree
- E - Roads in the North
- DFS&BFS算法总结(1)
- Word Ladder I
- 图的BFS和DFS学习笔记
- [LeetCode] Binary Tree Level Order Traversal
- [LeetCode] Binary Tree Level Order Traversal II
- 关于BFS搜索的思想, 最简单的水题,不过深有体会啊。
- Word Ladder II
- Surrounded Regions
- vijosP1016北京2008的挂钟 BFS + 优先队列
- FZU 2169 shadow
- 1215迷宫问题(wikioi)突破过程
- Catch That Cow