三个水杯-简单bfs
来源:互联网 发布:如何在淘宝上开好网店 编辑:程序博客网 时间:2024/05/04 11:40
给你三个水杯的容量,只有第一杯里面装满水,其他两个水杯是空的,再输入三个目标值,问你是否能通过倒水达到这个目标,如果能,输入最少步数,如果不能,输出-1.
这题其实就是一个简单的BFS,以前感觉太麻烦了,一直不想写,今天终于AC了它。最后提示一下,BFS还是加上标记比较好。
#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<queue>using namespace std;int v1,v2,v3,e1,e2,e3;int book[100][100][100];typedef struct{ int a,b,c,s;}node;void bfs(){ queue<node> q; node t; t.a = v1; t.b = 0; t.c = 0; t.s = 0; q.push(t); while(!q.empty()) { if(q.front().a == e1 && q.front().b == e2 && q.front().c == e3) { printf("%d\n",q.front().s); return; } if(q.front().a == v1 && q.front().b == v2 && q.front().c == 0 && q.front().s != 0) { printf("-1\n"); return; } t = q.front(); q.pop(); node n; if(t.a && t.b < v2)//ab { if(t.a >= (v2 - t.b)) { n.a = t.a - (v2 - t.b); n.b = v2; } else { n.a = 0; n.b = t.b + t.a; } n.c = t.c; n.s = t.s + 1; if(book[n.a][n.b][n.c]==0) { book[n.a][n.b][n.c]=1; q.push(n); } } if(t.a && t.c < v3)//ac { if(t.a >= (v3 - t.c)) { n.a = t.a - (v3 - t.c); n.c = v3; } else { n.a = 0; n.c = t.c + t.a; } n.b = t.b; n.s = t.s + 1; if(book[n.a][n.b][n.c]==0) { book[n.a][n.b][n.c]=1; q.push(n); } } if(t.b && t.a < v1)//ba { if(t.b >= (v1 - t.a)) { n.b = t.b - (v1 - t.a); n.a = v1; } else { n.b = 0; n.a = t.a + t.b; } n.c = t.c; n.s = t.s + 1; if(book[n.a][n.b][n.c]==0) { book[n.a][n.b][n.c]=1; q.push(n); } } if(t.b && t.c < v3)//bc { if(t.b >= (v3 - t.c)) { n.b = t.b - (v3 - t.c); n.c = v3; } else { n.b = 0; n.c = t.c + t.b; } n.a = t.a; n.s = t.s + 1; if(book[n.a][n.b][n.c]==0) { book[n.a][n.b][n.c]=1; q.push(n); } } if(t.c && t.a < v1)//ca { if(t.c >= (v1 - t.a)) { n.c = t.c - (v1 - t.a); n.a = v1; } else { n.c = 0; n.a = t.a + t.c; } n.b = t.b; n.s = t.s + 1; if(book[n.a][n.b][n.c]==0) { book[n.a][n.b][n.c]=1; q.push(n); } } if(t.c && t.b < v2)//cb { if(t.c >= (v2 - t.b)) { n.c = t.c - (v2 - t.b); n.b = v2; } else { n.c = 0; n.b = t.b + t.c; } n.a = t.a; n.s = t.s + 1; if(book[n.a][n.b][n.c]==0) { book[n.a][n.b][n.c]=1; q.push(n); } } } printf("-1\n");}int main(void){ int T; scanf("%d",&T); while(T--) { memset(book,0,sizeof(book)); scanf("%d%d%d",&v1,&v2,&v3); scanf("%d%d%d",&e1,&e2,&e3); bfs(); } return 0;}/*26 3 14 1 19 3 27 1 1*/
0 0
- 三个水杯-简单bfs
- 三个水杯 NYOJ BFS
- 三个水杯(BFS)
- NYOJ21 三个水杯 【BFS】
- NYoj21-三个水杯-BFS
- NYOJ三个水杯【BFS】
- nyoj 三个水杯 (BFS )
- 21 三个水杯【bfs】
- 三个水杯(bfs)
- NYOJ 21 三个水杯(bfs)
- NYOJ-21-三个水杯【BFS】
- NYOJ 21--三个水杯【BFS】
- bfs——三个水杯
- nyoj21 三个水杯 (BFS)
- NYOJ 21 三个水杯 (BFS)
- nyoj 21 三个水杯 bfs
- NYOJ 21三个水杯 BFS
- NYOJ--21--bfs--三个水杯
- JSP标签库JSTL
- cocos2dx[3.2](2) ——浅析cocos2dx3.2引擎目录
- 手机开发实战151——JPEG介绍2
- 测试驱动开发
- swift 点击空白键盘下去
- 三个水杯-简单bfs
- poj 2367 前向星+拓扑排序
- Ubuntu 下安装 Google Chrome
- 手机开发实战152——JPEG介绍3
- PX DPI PPI等概念
- 某NOIP模拟考试——2016.06.12
- 手机开发实战153——GIF介绍1
- Codeforces Round #311 (Div. 2) A~E && DE题解
- <meta>标签用法