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. Nginx 用户认证

    访问一些比较私密的页面 ( 如管理后台,数据后台 ) 时,我们就可以设置访问该页面时需要使用用户名和密码进行验证,这就是用户认证 [root@localhost ~]$ cat /usr/local/ ...

  2. Splash plugins_enabled 属性

    plugins_enabled属性可以控制浏览器插件(如 Flash 插件)是否开启.默认情况下,此属性是 false ,表示不开启. function main(splash, args) spla ...

  3. osg使用shader动态修改纹理坐标

    #include <osg/Node> #include <osg/Geometry> #include <osg/Notify> #include <osg ...

  4. centos6.4安装 jupyter-notebook

    自上次发布了文章后有些网友就说不能实现效果,根据自己的实验发现确实有此事,那是因为版本的变化问题.这次基于yum仓库里的jupyter notebook 5.0.0版本实现: 系统:最小化安装[习惯性 ...

  5. VMware 14 的永久许可密钥

    VMware workstation 14永久激活密钥分享: CG54H-D8D0H-H8DHY-C6X7X-N2KG6 ZC3WK-AFXEK-488JP-A7MQX-XL8YF AC5XK-0ZD ...

  6. Android学习之适配器ArrayAdapter SimpleAdapter

    Adapter是个什么角色呢?其实它的作用就是View界面和数据之间的桥梁.我们可以看作是界面数据绑定的一种理解,它所操纵的数据一般都是一些比较复杂的数据,如数组,链表,数据库,集合等. 常用的适配器 ...

  7. Android Studio中R报错(cnanot resolve symbol R)

    我的解决办法: Tools -> Android -> Sync Project with Gradle Files Build -> Clean Project 然后就好了 PS: ...

  8. android基础---->WidGet的使用

    Widget是一个可以添加在别的应用程序中的”小部件”,我们可以使用自定义的Widget远程控制我们的程序做一些事情.一般用于在桌面上添加一个小部件,现在我们开始小部件的学习. 目录导航: WidGe ...

  9. 【linux系列】centos7配置桥接模式静态IP

    一.设置桥接模式 VMware->Edit->Virtual Network Edit 二.查看物理机的ip地址 三.根据物理机的ip地址,设置linux虚拟机的ip地址 四.网络重启 五 ...

  10. [原]secureCRT 改变显示宽度

    1.首先全局设置:Options - Global Options - Terminal - Appearance - Maximumcolumns 最大只能设置成1024(推荐256),设置越大越占 ...