题目链接:http://poj.org/problem?id=1606

题目大意:有A,B两个水壶和无限的水,可以通过6种操作使得B水壶的水量刚好为N,输出满足题意的任意一种操作顺序。

六种操作:

①把A水壶加满

②把B水壶加满

③把A水壶的水全部倒掉

④把B水壶的水全部倒掉

⑤把A水壶里的水全部倒入B水壶中,溢出的水留在A水壶内

⑥把B水壶里的水全部倒入B水壶中,溢出的水留在B水壶内

题目思路:通过6种操作不断尝试使得,B水壶的水恰好等于N。利用宽度优先搜索,记录A和B内的水量的状态,对每种状态执行6种操作,出现过的状态不必再执行(没有意义),每次之前操作需要记录之前的操作,可以用指针来记录。当B水量等于N时,宽度优先搜索结束。记录的操作是反的,因此可以用一个stack来存,最后打印stack内的元素。

注意:利用指针记录地址,不要直接new,定义一个数组,取它的地址就行了,避免内存浪费。

AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
const int MAXN = 1e5+10;
const int CAP = 1010;
struct node{int a,b;//A水壶和B水壶现在的水量int op;//现在需要执行操作node* pre;//记录上一次操作
};
int vis[CAP][CAP];
queue<node> q;
stack<int> s;node tree[MAXN];int n,a,b;
node* bfs(){memset(vis,0,sizeof(vis));for(int i=0;i<MAXN;i++)tree[i].pre=NULL;//初始时A和B内水都是0,需要执行6种操作while(!q.empty()) q.pop();tree[0]=(node){0,0,1,NULL};tree[1]=(node){0,0,2,NULL};tree[2]=(node){0,0,3,NULL};tree[3]=(node){0,0,4,NULL};tree[4]=(node){0,0,5,NULL};tree[5]=(node){0,0,6,NULL};q.push(tree[0]);q.push(tree[1]);q.push(tree[2]);q.push(tree[3]);q.push(tree[4]);q.push(tree[5]);int cnt=5;while(!q.empty()){node now=q.front();++cnt;tree[cnt]=q.front();q.pop();node next;//取地址next.pre=&tree[cnt];next.a=now.a;next.b=now.b;if(now.b==n)return &tree[cnt];if(now.op==1)next.a=a;else if(now.op==2)next.b=b;else if(now.op==3)next.a=0;else if(now.op==4)next.b=0;else if(now.op==5){//pour A to Bif(now.b!=b){//B水壶的水溢出了if(now.a+now.b>b){next.b=b;next.a=now.a+now.b-b;}else{next.b=now.a+now.b;next.a=0;}}}else if(now.op==6){//pour B to Aif(now.a!=a){//A水壶的水溢出了if(now.a+now.b>a){next.a=a;next.b=now.a+now.b-a;}else{next.a=now.a+now.b;next.b=0;}}}//执行六种操作for(int i=1;i<=6;i++){if(!vis[next.a][next.b]){q.push((node){next.a,next.b,i,next.pre});  }}//出现过的状态没必要再执行了vis[next.a][next.b]=1;}
}void myPrint(int i){if(i==1)printf("fill A\n");else if(i==2)printf("fill B\n");else if(i==3)printf("empty A\n");else if(i==4)printf("empty B\n");else if(i==5)printf("pour A B\n");else if(i==6)printf("pour B A\n");
}int main(){//freopen("d.txt","r",stdin);while(~scanf("%d%d%d",&a,&b,&n)){node* ans=bfs();while(ans->pre!=NULL){ans=ans->pre;s.push(ans->op);}while(!s.empty()){myPrint(s.top());s.pop();}printf("success\n");}
}

poj1606 Jugs(BFS)相关推荐

  1. zoj 1005 Jugs BFS

    感想:这是我的第一道oj题,思路我想了很久,感觉建模能力还是不够强啊,理清楚了就好,把各个操作看成一条路,BFS就好 http://acm.zju.edu.cn/onlinejudge/showPro ...

  2. 问题 A: Jugs BFS

    灌水问题: 1. 该题关键是: 根据 "如果有n个壶容积分别为A1,A2,--,An(Ai均为大于0的整数)设w为另一大于0的整数.则用此n个壶可倒出w升水的充要条件为: 1) w小于等于A ...

  3. POJ 1606 Jugs

    POJ1606 Jugs   题目大意:指定两个水杯的容量A,B和规定的目标容量N,要求通过三种操作--要么倒空,要么续满,要么从一个杯子往另一个杯子里面倒水知道一个被倒空或另一个被倒满为止.   这 ...

  4. poj 1606 Jugs(广搜BFS+路径输出)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1606 此题和poj ...

  5. 算法笔记练习 8.2 广度优先搜索(BFS) 问题 A: Jugs

    算法笔记练习 题解合集 本题链接 题目 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were con ...

  6. poj 3414 Pots(广搜BFS+路径输出)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=3414 此题和poj ...

  7. 问题 A: Jugs

    时间限制: 1 Sec  内存限制: 32 MB 提交: 288  解决: 0 [提交][状态][讨论版][命题人:外部导入] 题目描述 In the movie "Die Hard 3&q ...

  8. Codeup100000609问题 A: Jugs

    题目描述: In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted with t ...

  9. 扩展欧几里德算法解决问题A:Jugs

    Jugs codeup的Jugs题目需要使用扩展欧几里德算法解决: Zoj的jugs题目需要使用BFS算法解决: codeup的Jugs题目需要使用扩展欧几里德算法解决: 题目链接:http://co ...

最新文章

  1. 全国计算机技术与软件专业技术资格(水平)考试徽标
  2. 数据结构--二叉树--路径 假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结
  3. 今天是 OSChina 上线 6 周年!
  4. 谁说IT男没有审美?怀揣5000元巨款,我们这样改变生活
  5. go语言switch语句用法
  6. nodejs原始连接mysql
  7. 两道关于回溯法,分支限界法的算法题
  8. mysql与linux版本区别_MySQL各版本的区别
  9. python3-爬取cnnvd漏洞库
  10. Java验证码图片生成实现
  11. Junit5 以及与Spring boot整合
  12. java毕业设计网上教学系统mybatis+源码+调试部署+系统+数据库+lw
  13. 司空见惯 - 洪荒之力
  14. 中国程序员容易发错音的单词「GitHub 热点速览 v.22.23」
  15. python clicknium 库自动化千牛桌面端
  16. NYNU_ACM 实验室招新月赛题解
  17. 论文写作学习之引言章节撰写(学习深度之眼课程笔记,侵删)
  18. javascript设计模式-门面模式(facade pattern)
  19. 蒋涛对话王成录:哪怕退休了我都想在中国把 HarmonyOS 做成
  20. Android 简单文件管理器

热门文章

  1. Excel怎么换行?简单!Excel大神教会了我N种换行方法
  2. 微信800android1840,微信8.0版本官方版
  3. 优化DNS,加快DNS的解析速度
  4. postgresql数据库中多个Schemas互相访问
  5. 麦克劳林级数与麦克劳林公式(泰勒公式)及傅里叶级数(易忘)
  6. 关于hadoop运行成功但是无法链接web页面
  7. netty学习01--nio与oio的比较
  8. 重庆崽儿,啷个能不回重庆撒!
  9. JeecgBoot 2.4.2 积木报表版本发布,基于SpringBoot的低代码平台
  10. java 实现EME2000(国家大地坐标系)转ECEF坐标系(地心地固坐标系)