POJ 3414 Pot (输出路径)【BFS】
<题目链接>
题目大意:
有两个容量的空杯子,能够对这两个空杯子进行三种操作:
分别是fill(a),装满a杯子;
drop(a),倒空a杯子;
pour(a,b),将a杯子中的水倒入b杯子中;
现在问你,是否能够通过这三种操作,使得这两个杯子中至少有一个杯子中含有c体积的水,如果不行,输出“impossible”,如果可以,输出操作的步数,以及每一步的具体操作。
解题分析:
此题与一道输出路径的很相像,只不过那道题是输出每一次操作对应的点的状态,而此题是要输出具体的操作。不难想到,我们依然可以记录下BFS路径上点的状态,然后根据这个点和上一个点的状态差距推导出它们之间的具体操作。
#include <cstdio>
#include <cstring> int v[],m; const int maxn=;
int vis[][];
int flag; struct node{
int val[];
int step;
int pre; //记录上一个点在que[]数组中的位置
node(int a=,int b=,int c=,int d=-){
val[]=a,val[]=b,step=c,pre=d;
}
}que[maxn]; void fill(node &now,int a){
now.val[a]=v[a];
} void drop(node &now,int a){
now.val[a]=;
} void pour(node &now,int a,int b){
int sum=now.val[a]+now.val[b];
if(sum>v[b]){
now.val[b]=v[b];
now.val[a]=sum-v[b];
}
else{
now.val[b]=sum;
now.val[a]=;
}
} void print(node tmp){ //根据相邻两个点的状况来推断操作
if(tmp.pre!=-){
print(que[tmp.pre]);
}
if(tmp.pre!=-){ //如果这个点和上一个点之间有操作,就可以将这个操作求出来
node prenode=que[tmp.pre];
node cal=prenode;
pour(cal,,);
if(tmp.val[]==v[]&&tmp.val[]==prenode.val[]){
printf("FILL(1)\n");
}
else if(tmp.val[]==v[]&&tmp.val[]==prenode.val[]){
printf("FILL(2)\n");
}
else if(tmp.val[]==&&tmp.val[]==prenode.val[]){
printf("DROP(1)\n");
}
else if(tmp.val[]==&&tmp.val[]==prenode.val[]){
printf("DROP(2)\n");
}
else if(cal.val[]==tmp.val[]&&cal.val[]==tmp.val[]){
printf("POUR(1,2)\n");
}
else{
printf("POUR(2,1)\n");
}
}
} void bfs(){
memset(vis,,sizeof(vis));
int front=,end=;
vis[][]=;
que[end++]=node(,,,-);
while(front<end){
node now=que[front];
front++;
if(now.val[]==m||now.val[]==m){
flag=true;
printf("%d\n",now.step);
print(now);
return;
}
for(int i=;i<=;i++){ //装满
node tmp=now; //注意,这里为了防止now发生改变,从而对后面的操作产生影响,所以这里是对tmp进行操作
fill(tmp,i);
if(!vis[tmp.val[]][tmp.val[]]){
vis[tmp.val[]][tmp.val[]]=;
que[end++]=node(tmp.val[],tmp.val[],tmp.step+,front-);
}
}
for(int i=;i<=;i++){ //倒空
node tmp=now;
drop(tmp,i);
if(!vis[tmp.val[]][tmp.val[]]){
vis[tmp.val[]][tmp.val[]]=;
que[end++]=node(tmp.val[],tmp.val[],tmp.step+,front-);
}
}
for(int i=;i<=;i++){ //i向j注水
for(int j=;j<=;j++){
if(i==j)continue;
node tmp=now;
pour(tmp,i,j);
if(!vis[tmp.val[]][tmp.val[]]){
vis[tmp.val[]][tmp.val[]]=;
que[end++]=node(tmp.val[],tmp.val[],tmp.step+,front-);
}
}
}
}
} int main(){
while(scanf("%d %d %d",&v[],&v[],&m)!=EOF){
flag=false;
bfs();
if(!flag){
printf("impossible\n");
}
}
return ;
}
2018-08-29
POJ 3414 Pot (输出路径)【BFS】的更多相关文章
- Pots POJ - 3414【状态转移bfs+回溯】
典型的倒水问题: 即把两个水杯的每种状态视为bfs图中的点,如果两种状态可以转化,即可认为二者之间可以连一条边. 有3种倒水的方法,对应2个杯子,共有6种可能的状态转移方式.即相当于图中想走的方法有6 ...
- POJ 3414 Pots 记录路径的广搜
Description You are given two pots, having the volume of A and B liters respectively. The following ...
- HDU 1043 Eight 【经典八数码输出路径/BFS/A*/康托展开】
本题有写法好几个写法,但主要思路是BFS: No.1 采用双向宽搜,分别从起始态和结束态进行宽搜,暴力判重.如果只进行单向会超时. No.2 采用hash进行判重,宽搜采用单向就可以AC. No.3 ...
- 【POJ - 3414】Pots(bfs)
Pots 直接上中文 Descriptions: 给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i) 将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DRO ...
- Pots(POJ - 3414)【BFS 寻找最短路+路径输出】
Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...
- 广搜+输出路径 POJ 3414 Pots
POJ 3414 Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13547 Accepted: 5718 ...
- poj 3414 Pots 【BFS+记录路径 】
//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...
- (poj)3414 Pots (输出路径的广搜)
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 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...
随机推荐
- luogu P3760 [TJOI2017]异或和
传送门 对于每个二进制位考虑有多少区间和这一位上为1 从前往后扫每个前缀和,如果当前这个前缀和某一个二进制位上为1,因为区间和由这个前缀和减去前面的前缀和得来,如果减去了这一位为0的前缀和,那么 减去 ...
- AES加解密算法
直接粘代码,该类是基于微信公众号消息加密解密所提供的PHP DEMO改造而来,目前使用于彬彬大学APP接口token校验中. php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被 ...
- VS2012 安装番茄插件
1.visual assist x 1929_大番茄.rar 下载地址: http://pan.baidu.com/s/1qXOUuJE 网盘提取密码: 3mka 文件解压密码: eg5p 2.安装完 ...
- Microservice Patterns
https://www.manning.com/books/microservice-patterns http://www.jianshu.com/p/2f32ac949138
- 列式数据库~clickhouse 底层存储原理
简介:今天介绍列式数据库的一些基本原理 一 数据目录 Data目录 数据存储目录,数据按照part分成多个文件夹,每个文件夹下存储相应数据和对应的元信息文件 Metadata 表定义语句,存储所有表 ...
- 上传程序Dictionary 字典 哈希--多读一写锁ReaderWriterLock
//上传程序Dictionary 字典 哈希 /// <summary> /// 车辆控制信息哈斯表,Key是终端号,Value是车辆信息控制对象 /// </summary> ...
- Servlet3.0的注解自定义原生Servlet实战
Servlet3.0的注解自定义原生Servlet实战 讲解:使用 Servlet3.0的注解自定义原生Servlet和Listener 自定义原生Servlet package net.xdclas ...
- Netty通信原理
Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端,它极大的简化了TCP和UDP套接字服务器等网络编程. BIO(Blocking IO):每一个请求,一个S ...
- sqlserver中将查询结果拼接成字符串
#for xml path(param)--将查询结果以xml格式输出 select id,name from table1 for xml path --id和name为table1的真实字段 - ...
- git强制覆盖更新
1.选择项目,右键选择Team,选择Team里面的Reset. 2.点击Reset后弹出Reset窗口,选择Hard选项,这样就会把远端的项目完全拉下来覆盖本地,本地没有的文件也会被创建,点击确定.