HDU 1495 非常可乐(BFS)
来源:互联网 发布:python的join函数 编辑:程序博客网 时间:2024/05/19 00:48
很简单的BFS,由于一个小小BUG,调了一个晚上~
再次接触搜索专题,有了一丝不一样的感觉,再看紫书,才明白其中的一些精华 。
其实,搜索和动归简直是密不可分,什么BFS啊DFS啊其实都是搜索,手段都是一样的,目的也是一样的。
对于搜索,现在逐渐重视到了一个之前忽视的东西:状态。 其实搜索的就是状态,定义的也是状态,剪枝剪掉的还是状态,记忆化搜索保存的也是状态。
对于一个搜索,你会遍历到多少状态,那就是你要花费的时间复杂度(前提是每个状态只遍历一次)。 对于DFS,他并不是每个状态只经过一次的,由于每次都从头开始搜,所以其时间复杂度很高,而BFS他已经将经历过的状态去除了,这就有点像DP,也是每个状态只经历一次。
该题的状态就是三个杯子目前水量的情况。 那么对于每一层,又6种决策,分别是对于每一个杯子,是全部到给其他某个杯子还是要留下一些。
细节参见代码:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<map>#include<vector>#include<queue>#include<list>#include<set>#include<cmath>using namespace std;typedef long long ll;const int mod = 1e9 + 7;const int INF = 1e9;const int maxn = 100 + 5;int n,m,T,s,t,d[maxn][maxn];struct node{ int a,b,c; node(int a=0,int b=0,int c=0):a(a),b(b),c(c) {} bool operator == (const node& rhs) const { return a == rhs.a && b == rhs.b && c == rhs.c; }};int bfs(int s) { queue<node> q; memset(d,-1,sizeof(d)); d[s][0] = 0; q.push(node(s,0,0)); while(!q.empty()) { node u = q.front(); q.pop(); if((u.a == s/2 && u.b == s/2)||(u.a == s/2 && u.c == s/2)||(u.b == s/2 && u.c == s/2)) return d[u.a][u.b]; for(int i=1;i<=3;i++) { node v = u; if(i == 1) { if(v.a == 0) continue; if(v.a+v.b <= n) { v.b += v.a; v.a = 0; } else { v.a -= (n-v.b); v.b = n; } if(d[v.a][v.b] == -1) { d[v.a][v.b] = d[u.a][u.b] + 1; q.push(v); } v = u; if(v.a+v.c <= m) { v.c += v.a; v.a = 0; } else { v.a -= (m-v.c); v.c = m; } if(d[v.a][v.b] == -1) { d[v.a][v.b] = d[u.a][u.b] + 1; q.push(v); } } else if(i == 2) { if(v.b == 0) continue; v.a += v.b; v.b = 0; if(d[v.a][v.b] == -1) { d[v.a][v.b] = d[u.a][u.b] + 1; q.push(v); } v = u; if(v.b+v.c <= m) { v.c += v.b; v.b = 0; } else { v.b -= (m-v.c); v.c = m; } if(d[v.a][v.b] == -1) { d[v.a][v.b] = d[u.a][u.b] + 1; q.push(v); } } else { if(v.c == 0) continue; v.a += v.c; v.c = 0; if(d[v.a][v.b] == -1) { d[v.a][v.b] = d[u.a][u.b] + 1; q.push(v); } v = u; if(v.c+v.b <= n) { v.b += v.c; v.c = 0; } else { v.c -= (n-v.b); v.b = n; } if(d[v.a][v.b] == -1) { d[v.a][v.b] = d[u.a][u.b] + 1; q.push(v); } } } } return -1;}int main() { while(~scanf("%d%d%d",&s,&n,&m)) { if(!s && !n && !m) return 0; if(s & 1) printf("NO\n"); else { int ans = bfs(s); if(ans == -1) printf("NO\n"); else printf("%d\n",ans); } } return 0;}
0 0
- hdu 1495 非常可乐(BFS)
- HDU 1495非常可乐(BFS)
- HDU 1495 非常可乐 (BFS)
- HDU 1495 非常可乐(BFS & STL)
- HDU 1495 非常可乐(bfs)
- HDU 1495 非常可乐(BFS+模拟)
- HDU 1495 非常可乐(BFS)
- HDU - 1495 非常可乐(BFS)
- HDU 1495 非常可乐 (BFS)
- HDU 1495 非常可乐(BFS)
- HDU-1495-非常可乐(BFS/GCD)
- hdu 1495 非常可乐(bfs)
- HDU 1495 非常可乐(BFS + 模拟)
- HDU 1495 非常可乐 (BFS)
- HDU 1495 非常可乐(bfs)
- HDU 1495 非常可乐(BFS)
- HDU.1495 非常可乐 (BFS)
- 【HDU 1495】非常可乐(BFS)
- 简单计算器
- Mark
- 使用递归逆序一个栈
- ascii码问题
- 毕业三月小结
- HDU 1495 非常可乐(BFS)
- mac、win自动化总结
- Git 命令别名
- 数据库索引失效的原因
- 网易互联网部门2016年校园招聘笔试
- 游戏编程日记
- Node.js 本地版本控制
- 进程与线程的一个简单解释
- MQX 读写U盘