http://poj.org/problem?id=3414

题意:

给你两个容量为a,b的杯子;有3个操作:

1:FILL(i);把第i个杯子从水库中装满;

2:DROP(i);把第i个杯子清空;

3:POUR(i,j);把第i个杯子的水移入到j中,直到第i个杯子空了或者第j个杯子满了为止;

分析:本题和上篇的差不多,多的就是输出路径;

包含六个过程:水池—>a; 水池—>b;a->水池;b->水池;a->b;b->a;

      |  prea

pre[x][y]  |  preb

      | op

第一个杯子的水量为x,第二个杯子水量为y它是由第一个水量为pre[x][y].prea、第二个水量为pre[x][y].preb经过操作op来变成的;

最后根据最终两个杯子中水的剩余量把路径倒着存入path中;

代码如下:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
#define N 110
using namespace std;
struct node
{
int a,b,step;
friend bool operator< (node a,node b)
{
return a.step>b.step;
}
};
struct NODE
{
int prea,preb,op;
};
NODE pre[N][N];
int a,b,c,flag;
int vis[N][N];
node bfs()
{
int i;
priority_queue<node>Q;
node p,q;
p.a=p.b=;
p.step=;
pre[][].prea=pre[][].prea=pre[][].op=;
memset(vis,,sizeof(vis));
vis[][]=;
Q.push(p);
while(!Q.empty())
{
q=Q.top();
Q.pop();
if(q.a==c||q.b==c)
{
flag=;
return q;
}
for(i=;i<=;i++)
{
if(i==)//FILL(1);
{
p.a=a;
p.b=q.b;
}
if(i==)//FILL(2);
{
p.a=q.a;
p.b=b;
}
if(i==)//DROP(1)
{
p.a=;
p.b=q.b;
}
if(i==)//DROP(2)
{
p.a=q.a;
p.b=;
}
if(i==)//POUR(1,2)
{
if(b-q.b>=q.a)//a倒b中,a倒完了;
{
p.a=;
p.b=q.a+q.b;
}
else
{
p.b=b;
p.a=q.a-(b-q.b);
}
}
if(i==)//POUR(2,1)
{
if(a-q.a>=q.b)//b倒a中,b倒完了;
{
p.b=;
p.a=q.a+q.b;
}
else
{
p.a=a;
p.b=q.b-(a-q.a);
}
}
if(vis[p.a][p.b]==)
{
vis[p.a][p.b]=; p.step=q.step+; pre[p.a][p.b].prea=q.a;
pre[p.a][p.b].preb=q.b;
pre[p.a][p.b].op=i; Q.push(p);
}
} } } int main()
{
node re;
int path[N],i,x,y,step,x1;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
memset(path,,sizeof(path));
flag=;
re=bfs();
if(flag==)
{
printf("impossible\n");
}
else
{
printf("%d\n",re.step);
step=re.step;
x=re.a;
y=re.b;
for(i=step;i>=;i--)//把路径保存在path中;
{
path[i]=pre[x][y].op;
x1=x;
x=pre[x1][y].prea;//更新x,y;
y=pre[x1][y].preb;
}
for(i=;i<=re.step;i++)
{
if(path[i]==)
{
printf("FILL(1)\n");
}
if(path[i]==)
{
printf("FILL(2)\n");
}
if(path[i]==)
{
printf("DROP(1)\n");
}
if(path[i]==)
{
printf("DROP(2)\n");
}
if(path[i]==)
{
printf("POUR(1,2)\n");
}
if(path[i]==)
{
printf("POUR(2,1)\n");
}
}
} }
return ;
}

Pots--poj(bfs,输出路径)的更多相关文章

  1. poj 3414 Pots 【BFS+记录路径 】

    //yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...

  2. hdu 1026(BFS+输出路径) 我要和怪兽决斗

    http://acm.hdu.edu.cn/showproblem.php?pid=1026 模拟一个人走迷宫,起点在(0,0)位置,遇到怪兽要和他决斗,决斗时间为那个格子的数字,就是走一个格子花费时 ...

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

    Description You are given two pots, having the volume of A and B liters respectively. The following ...

  4. poj 3414 Pots【bfs+回溯路径 正向输出】

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

  5. (简单) POJ 3414 Pots,BFS+记录路径。

    Description You are given two pots, having the volume of A and B liters respectively. The following ...

  6. 蓝桥T291(BFS + 输出路径)

    http://lx.lanqiao.org/problem.page?gpid=T291 学霸的迷宫   时间限制:1.0s   内存限制:256.0MB      问题描述 学霸抢走了大家的作业,班 ...

  7. bfs输出路径 && 最短路(迪杰斯特拉)输出路径

    问题描述 解决方法 1.像第一个问题那就是最短路问题(我代码采用迪杰斯特拉算法)实现 2.换乘次数最少,那就用bfs广搜来寻找答案.但是我的代码不能保证这个最少换乘是最短路程 代码 1 #includ ...

  8. 地下迷宫(bfs输出路径)

    题解:开一个pre数组用编号代替当前位置,编号用结构题另存,其实也可以i*m+j来代替,我写的有点麻烦了; 代码: #include <iostream> #include <cst ...

  9. Pots(POJ - 3414)【BFS 寻找最短路+路径输出】

    Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...

  10. (poj)3414 Pots (输出路径的广搜)

    Description You are given two pots, having the volume of A and B liters respectively. The following ...

随机推荐

  1. iOS开发-- 使用NSNumber将int、float、long等数据类型加入到数组或字典中

    // 设置值 NSNumber *number=[NSNumber numberWithInt:45]; // 取值 NSLog(@"NSNumber %d",[number in ...

  2. SpringBoot(十)-- 整合MyBatis

    1.pom.xml 配置maven依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <ar ...

  3. jinja语法

    <!--base.html--> <!DOCTYPE html> <html lang="en"> <head> <!--ht ...

  4. vim 编辑基础使用-----linux编程

    Linux系统编程: VIM编辑器 | VIM Introduce 学习 vim 并且其会成为你最后一个使用的文本编辑器.没有比这个更好的文本编辑器了,非常地难学,但是却不可思议地好用. 我建议下面这 ...

  5. 【LeetCode OJ】Remove Nth Node From End of List

    题目:Given a linked list, remove the nth node from the end of list and return its head. For example: G ...

  6. springmvc接收前台(可以是ajax)传来的数组list,map,set等集合,复杂对象集合等图文详解

    参考帖子: http://blog.csdn.net/wabiaozia/article/details/50803581 方法参考: { "token":"" ...

  7. U盘安装centos6.4:缺少iso 9660映像

    方法: 1.下载安装的ISO文件    到www.centos.org网站下载对应的Centos 6.4安装文件.下载站点我一般选择网易镜像站点    64位下载参考链接:http://mirrors ...

  8. find中的-print0和xargs中-0的奥妙

    原文地址:find中的-print0和xargs中-0的奥妙作者:改变自己 默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('n'), 因此我们看到的 find 的输出都是一 ...

  9. Esper学习之十四:Pattern(一)

    1. Pattern Atoms and Pattern operatorsPattern是通过原子事件和操作符组合在一起构成模板.原子事件有3类,操作符有4类,具体如下: 原子事件:1). 普通事件 ...

  10. OAuth网络协议(转)

    一.应用场景 为了理解OAuth的适用场合,让我举一个假设的例子. 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来.用户为了使用该服务,必须让"云冲 ...