Pots--poj(bfs,输出路径)
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,输出路径)的更多相关文章
- poj 3414 Pots 【BFS+记录路径 】
		//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ... 
- hdu 1026(BFS+输出路径) 我要和怪兽决斗
		http://acm.hdu.edu.cn/showproblem.php?pid=1026 模拟一个人走迷宫,起点在(0,0)位置,遇到怪兽要和他决斗,决斗时间为那个格子的数字,就是走一个格子花费时 ... 
- poj 3414 Pots(bfs+输出路径)
		Description You are given two pots, having the volume of A and B liters respectively. The following ... 
- poj 3414 Pots【bfs+回溯路径 正向输出】
		题目地址:http://poj.org/problem?id=3414 Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions ... 
- (简单)  POJ  3414  Pots,BFS+记录路径。
		Description You are given two pots, having the volume of A and B liters respectively. The following ... 
- 蓝桥T291(BFS + 输出路径)
		http://lx.lanqiao.org/problem.page?gpid=T291 学霸的迷宫 时间限制:1.0s 内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班 ... 
- bfs输出路径 && 最短路(迪杰斯特拉)输出路径
		问题描述 解决方法 1.像第一个问题那就是最短路问题(我代码采用迪杰斯特拉算法)实现 2.换乘次数最少,那就用bfs广搜来寻找答案.但是我的代码不能保证这个最少换乘是最短路程 代码 1 #includ ... 
- 地下迷宫(bfs输出路径)
		题解:开一个pre数组用编号代替当前位置,编号用结构题另存,其实也可以i*m+j来代替,我写的有点麻烦了; 代码: #include <iostream> #include <cst ... 
- Pots(POJ - 3414)【BFS 寻找最短路+路径输出】
		Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ... 
- (poj)3414   Pots (输出路径的广搜)
		Description You are given two pots, having the volume of A and B liters respectively. The following ... 
随机推荐
- ZooKeeper 未授权访问漏洞
			ZooKeeper 安装: Zookeeper的默认开放端口是2181 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zooke ... 
- [Python] Unofficial Windows Binaries for Python Extension Packages
			1. Unofficial Windows Binaries for Python Extension Packages 非官方的Python第三方库,提供基于Windows的二进制扩展包,由加州大学 ... 
- N76E003之IO控制
			N76E003最多支持26个可位寻址的通用I/O引脚,分成4组 P0 到 P3 .每一个端口有它的端口控制寄存器(Px).端口控制寄存器的写和读有不同的意思.写端口控制寄存器设置输出锁存逻辑值,读端口 ... 
- lua总则
			lua官方英文文档:http://www.lua.org/manual/5.2/ lua中国开发者网址:http://bbs.luaer.cn/ <lua程序设计(第二版)>(闭合函数和闭 ... 
- listView优化方案
			1.如果自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如果为null就创建contentView并返回,如果不为null则直接使用.在这个方法中尽 ... 
- android基础---->WidGet的使用
			Widget是一个可以添加在别的应用程序中的”小部件”,我们可以使用自定义的Widget远程控制我们的程序做一些事情.一般用于在桌面上添加一个小部件,现在我们开始小部件的学习. 目录导航: WidGe ... 
- Android.mk(4) 依赖:目标编程的模式
			https://www.jianshu.com/p/3777a585a8d0 另一种范式 我一直觉得,Makefile确实是C/C++程序员的良配,因为Makefile所使用的两种范式都是C/C++程 ... 
- hdu3507 Print Article[斜率优化dp入门题]
			Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ... 
- JiraRemoteUserAuth
			配置Jira7.x版本使用REMOTE_USER的HTTP Header方式登录: 前提是已经安装好了JIRA,并且前端使用apache或者nginx拦截对应的地址进行认证,认证之后访问对应的应用的时 ... 
- Gradle gitignore  Gradle 模式 上传SVN 要忽略的文件
			.gradle /local.properties /.idea/workspace.xml /.idea/libraries .DS_Store /build /captures /.idea *. ... 
