想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410
                                     转载请注明出处:http://blog.csdn.net/wangjian8006

题目大意:

有二个水壶,对水壶有三种操作,1)FILL(i),将i水壶的水填满,2)DROP(i),将水壶i中的水全部倒掉,3)POUR(i,j)将水壶i中的水倒到水壶j中,若水壶 j 满了,则 i 剩下的就不倒了,问进行多少步操作,并且怎么操作,输出操作的步骤,两个水壶中的水可以达到C这个水量。如果不可能则输出impossible。初始时两个水壶是空的,没有水。

解题思路:

因为两个水壶A和B中的水量都不超过100,所以开个100*100的二维数组即可,map[i][j]表示第一个水壶中的水为i,第二个水壶中的水为j,BFS从0,0开始搜索,如果队列找完还没找完就找不到结果,而且BFS之后会生成一棵树,用parent表示这个节点的父亲节点,需要对这棵树进行操作,统计并从根节点开始输出。

代码:

#include <iostream>
#include <queue>
using namespace std;
#define MAXV 110
typedef struct Node{
int aa,bb,type,cout;
int i;
int pa,pb,ca,cb;
}VNode;
VNode map[MAXV][MAXV],v,temp;
bool dis[MAXV][MAXV];
void write(int first,int last){
int ft,lt;
printf("%d\n",map[first][last].cout);
map[first][last].ca=-1,map[first][last].cb=-1;
while(map[first][last].pa!=-1 && map[first][last].pb !=-1){
ft=first,lt=last;
v=map[map[first][last].pa][map[first][last].pb];
map[map[first][last].pa][map[first][last].pb].ca=first,map[map[first][last].pa][map[first][last].pb].cb=last;
first=v.aa,last=v.bb;
}
while(map[first][last].ca!=-1 && map[first][last].cb !=-1){
ft=first,lt=last;
switch(map[map[first][last].ca][map[first][last].cb].type){
case 1:printf("FILL(%d)\n",map[map[first][last].ca][map[first][last].cb].i);break;
case 2:printf("POUR(%d,%d)\n",map[map[first][last].ca][map[first][last].cb].i^3,map[map[first][last].ca][map[first][last].cb].i);break;
case 3:printf("DROP(%d)\n",map[map[first][last].ca][map[first][last].cb].i);break;
}
first=map[ft][lt].ca,last=map[ft][lt].cb;
}
}
int bfs(int a,int b,int c){
queue <VNode>q;
memset(dis,false,sizeof(dis));
memset(map,0,sizeof(map));
dis[0][0]=true;
map[0][0].pa=-1,map[0][0].pb=-1;
q.push(map[0][0]);
while(!q.empty()){
temp=v=q.front();
q.pop();
//      printf("%d %d %d\n",v.aa,v.bb,v.cout);
v.aa=a;
if(!dis[v.aa][v.bb]){
dis[v.aa][v.bb]=true;
v.cout=temp.cout+1;
v.pa=temp.aa,v.pb=temp.bb;
v.type=1;
v.i=1;
map[v.aa][v.bb]=v;
if(v.aa==c || v.bb==c) {write(v.aa,v.bb);return 0;}
q.push(v);
}
v=temp;
v.bb=b;
if(!dis[v.aa][v.bb]){
dis[v.aa][v.bb]=true;
v.cout=temp.cout+1;
v.pa=temp.aa,v.pb=temp.bb;
v.type=1;
v.i=2;
map[v.aa][v.bb]=v;
if(v.aa==c || v.bb==c) {write(v.aa,v.bb);return 0;}
q.push(v);
}
v=temp;
v.aa=v.bb+v.aa;
if(v.aa>a) {
v.bb=v.aa-a;
v.aa=a;
}else v.bb=0;
if(!dis[v.aa][v.bb]){
dis[v.aa][v.bb]=true;
v.cout=temp.cout+1;
v.pa=temp.aa,v.pb=temp.bb;
v.type=2;
v.i=1;
map[v.aa][v.bb]=v;
if(v.aa==c || v.bb==c) {write(v.aa,v.bb);return 0;}
q.push(v);
}
v=temp;
v.bb=v.bb+v.aa;
if(v.bb>b) {
v.aa=v.bb-b;
v.bb=b;
}else v.aa=0;
if(!dis[v.aa][v.bb]){
dis[v.aa][v.bb]=true;
v.cout=temp.cout+1;
v.pa=temp.aa,v.pb=temp.bb;
v.type=2;
v.i=2;
map[v.aa][v.bb]=v;
if(v.aa==c || v.bb==c) {write(v.aa,v.bb);return 0;}
q.push(v);
}
v=temp;
v.aa=0;
if(!dis[v.aa][v.bb]){
dis[v.aa][v.bb]=true;
v.cout=temp.cout+1;
v.pa=temp.aa,v.pb=temp.bb;
v.type=3;
v.i=1;
map[v.aa][v.bb]=v;
if(v.aa==c || v.bb==c) {write(v.aa,v.bb);return 0;}
q.push(v);
}
v=temp;
v.bb=0;
if(!dis[v.aa][v.bb]){
dis[v.aa][v.bb]=true;
v.cout=temp.cout+1;
v.pa=temp.aa,v.pb=temp.bb;
v.type=3;
v.i=2;
map[v.aa][v.bb]=v;
if(v.aa==c || v.bb==c) {write(v.aa,v.bb);return 0;}
q.push(v);
}
}
//  printf("a%d b%d %d\n",v.aa,v.bb,v.cout);
return -1;
}
int main(){
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)!=EOF){
a=bfs(a,b,c);
if(a==-1) printf("impossible\n");
}
return 0;
}

poj3414 - Pots相关推荐

  1. POJ3414 Pots —— BFS + 模拟

    题目链接:http://poj.org/problem?id=3414 Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

  2. POJ-3414 Pots BFS+记忆路径

    这题让我想起了杭电的那一道三个可乐罐的题目,那一题好像只要输出次数就可以了,而这里则需要将所有的路径全部输出出来,这样的话,单纯的BFS则会在状态的保留上会出现大量的空间冗余.于是这题在考虑到搜索空间 ...

  3. ICPC程序设计题解书籍系列之九:罗勇军《算法竞赛入门到进阶》

    罗书<算法竞赛入门到进阶>题目一览 第1章 算法竞赛概述 HDU1000 HDU1089-HDU1096 A+B for Input-Output Practice (I)-(VIII)( ...

  4. kuangbin 专题一 简单搜索

    kuangbin 专题一 简单搜索 1.POJ1321棋盘问题[DFS] 代码 自己的想法 2.POJ2251Dungeon Master[三维空间BFS] 代码 自己的想法 3.POJ3278 Ca ...

  5. 整理:poj 基本搜索

    参考:http://exp-blog.com/ https://blog.csdn.net/consciousman/article/details/54613292 POJ2488 – A Knig ...

  6. 算法之路——深搜、广搜(简单搜索)

    搜索 通过一定的顺序,枚举每一个数据(经常会通过一些判断条件去掉无意义的数据,即剪枝),找到想要的数据的过程. 深度优先搜索(dfs) 深度优先搜索属于图算法的一种,是一个针对图和树的算法,应为缩写为 ...

  7. Pots(poj-3414)bfs+输出路径

    题目描述 You are given two pots, having the volume of A and B liters respectively. The following operati ...

  8. H - Pots POJ - 3414(两个锅互相倒水)

    H - Pots POJ - 3414 题意: (两个锅互相倒水)希望能通过题目中的几种操作使一个锅中的水量为目标水量 bfs 搜索每一步的每种操作,直到所有操作用完,则impossible,否则输出 ...

  9. POJ 3414 Pots(罐子)

    POJ 3414 Pots(罐子) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 You are given two po ...

最新文章

  1. 使用java搭建直播平台,我就不信你还听不明白了!
  2. pandas中drop用法_如何使用drop方法对数据进行删减处理
  3. 30+个必知的《人工智能》会议清单
  4. no java virtual machine was found after searching Failed to load the JNI shared library
  5. WPF系列 自定控件
  6. 如何理解离散傅里叶变换(一)实数形式傅里叶变换
  7. 蛋白结构建模与优化_最终幻想: 无中生有的蛋白质从头设计
  8. 学术科普 | 漫威电影中的智能大脑
  9. 内涝预测过程的噪音_提高人工智能模型准确率的测试过程中需要注意什么?
  10. jsp实现购物车结算页面
  11. GB28181协议之语音对讲
  12. 光敏二极管、光电二极管判断正负
  13. 智邦国际ERP软件实施成功的七大步骤
  14. Java核心编程总结(六、常用API与集合)
  15. 非单射一致性和单射一致性的概念辨析
  16. 阿迪达斯进博会展示首款碳足迹低于3千克运动鞋;霍尼韦尔携30余项产品和解决方案亮相进博会 | 美通社头条...
  17. win7 关闭计算机休眠,技术编辑教您win7下怎么关闭休眠
  18. hackinglab.cn脚本关之三
  19. 【学习笔记】行人异常行为检测的综述
  20. 带SN切换流程_抖音频繁切换账号会限流吗?抖音频繁切换账号会降权吗?

热门文章

  1. 互联网医院在线问诊系统-医院远程问诊,守护您的健康
  2. maven编译报错Blocked mirror for repositories解决
  3. 通过bat运行powershell 脚本
  4. GitHub官方出手,一针见血!Spring Boot趣味实战手册来袭(彩版)
  5. 期货公司的评级和查询详情
  6. 如何个性化U盘或硬盘图标
  7. Navicat连接linux服务器的mysql。
  8. nmn到底怎么样,nmn男性三高临床应用价值分享
  9. page_fault_in_nonpaged_area(win32k.sys)错误解决方法
  10. 大学里不该做的N件事