NYOJ(21),BFS,三个水杯
2016-08-05 17:26
399 查看
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=21
BFS判环,vis标记状态即可。
BFS判环,vis标记状态即可。
#include <stdio.h> #include <queue> #include <string.h> using namespace std; bool vis[100][100][100]; struct Cup { int v[3]; int step; }; int s[3],t[3]; int bfs() { memset(vis,false,sizeof(vis)); Cup start; start.step = 0; start.v[0] = s[0]; start.v[1] = 0; start.v[2] = 0; vis[s[0]][0][0] = true; queue<Cup> Q; Q.push(start); while(!Q.empty()) { start = Q.front(); Q.pop(); if(start.v[0]==t[0]&&start.v[1]==t[1]&&start.v[2]==t[2]) return start.step; for(int i=0; i<3; i++) { for(int j=0; j<3; j++) { Cup tmp = start; if(i==j||tmp.v[i]==0||tmp.v[j]==s[j]) continue; if(tmp.v[i]+tmp.v[j]<=s[j]) { tmp.v[j] = tmp.v[i]+tmp.v[j]; tmp.v[i] = 0; } else { tmp.v[i] = tmp.v[i] - (s[j]-tmp.v[j]); tmp.v[j] = s[j]; } tmp.step++; if(!vis[tmp.v[0]][tmp.v[1]][tmp.v[2]]) { Q.push(tmp); vis[tmp.v[0]][tmp.v[1]][tmp.v[2]] = true; } } } } return -1; } int main() { int cases; scanf("%d",&cases); while(cases--) { for(int i=0; i<3; i++) scanf("%d",&s[i]); for(int i=0; i<3; i++) scanf("%d",&t[i]); printf("%d\n",bfs()); } return 0; }
相关文章推荐
- 分布式存储系统设计
- HDU1565
- Android面试要点
- Activity四种启动模式
- python中的yield浅析(每次在用到的时候都感觉逻辑很混乱,多看一下这个)
- java.lang.instrument 学习(一)
- Android Asynctask
- HDU1712(题目大意+理解)
- 为UIView添加点击事件
- Java 集合:Collection 系列(HashSet)
- HDU 3389 Game
- 初探tensorflow
- Linux每天一点目录处理命令
- RxJava的学习(附demo)
- SAP MM模块常用事务代码
- iOS native 与 js 通信 资料汇总
- 并发容器之ConcurrentSkipListSet
- Redis 持久化
- HashCode 使用产生Utils类
- div的几种声明控制