Pots POJ - 3414【状态转移bfs+回溯】
典型的倒水问题:
即把两个水杯的每种状态视为bfs图中的点,如果两种状态可以转化,即可认为二者之间可以连一条边。
有3种倒水的方法,对应2个杯子,共有6种可能的状态转移方式。即相当于图中想走的方法有6种,依次枚举即可。
用一个二维数组标记状态,以免重复。
难点在于输出路径,即bfs回溯。
我的处理方法是,在bfs的队列基础上,用一个vector保存每一个可能的状态,即每个状态对应一个编号。同时结构体中不仅保存每个状态的信息,而且还要保存每个状态的对应编号和上一个状态的对应编号。
那么,当bfs到达终点后,就可以从后向前进行回溯,找到路径,然后反向输出即可。
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
int Va,Vb,C;
struct pot
{
int a,b,step,t,my,last;
};
bool vis[][];
int a[];
queue<pot>que;
vector<pot>pre;
int bfs()
{
while(!que.empty())
que.pop();
pot s=pot{,,-,,,-};
que.push(s);
vis[][]=;
pre.push_back(s);
while(!que.empty())
{
pot now=que.front();
que.pop();
for(int i=;i<;i++)
{
pot tmp=now;
if(i==)//fill(1)
tmp.a=Va;
else if(i==)//fill(2)
tmp.b=Vb;
else if(i==)//drop(1)
tmp.a=;
else if(i==)//drop(2)
tmp.b=;
else if(i==)//pour(1,2)
{
if(tmp.a>Vb-tmp.b)
{
tmp.a-=(Vb-tmp.b);
tmp.b=Vb;
}
else
{
tmp.b+=tmp.a;
tmp.a=;
}
}
else if(i==)//pour(2,1)
{
if(tmp.b>Va-tmp.a)
{
tmp.b-=(Va-tmp.a);
tmp.a=Va;
}
else
{
tmp.a+=tmp.b;
tmp.b=;
}
}
if(!vis[tmp.a][tmp.b])
{
tmp.step=i;
tmp.t=now.t+;
tmp.last=now.my;
pre.push_back(tmp);
tmp.my=pre.size()-;
vis[tmp.a][tmp.b]=;
que.push(tmp);
if(tmp.a==C||tmp.b==C)
return tmp.t;
}
}
}
return -;
}
void print(int u)
{
if(u==)
printf("FILL(1)\n");
else if(u==)
printf("FILL(2)\n");
else if(u==)
printf("DROP(1)\n");
else if(u==)
printf("DROP(2)\n");
else if(u==)
printf("POUR(1,2)\n");
else if(u==)
printf("POUR(2,1)\n");
}
int main()
{
while(scanf("%d%d%d",&Va,&Vb,&C)!=EOF)
{
memset(vis,,sizeof(vis));
pre.clear();
int ans=bfs();
if(ans==-)
printf("impossible\n");
else
{
printf("%d\n",ans);
memset(a,,sizeof(a));
int p=pre.size()-;
int cnt=;
while(pre[p].last!=-)
{
a[++cnt]=pre[p].step;
p=pre[p].last;
}
for(int i=cnt;i>=;i--)
print(a[i]);
}
}
return ;
}
Pots POJ - 3414【状态转移bfs+回溯】的更多相关文章
- Pots(POJ - 3414)【BFS 寻找最短路+路径输出】
Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...
- Pots POJ 3414
/* *POJ 3414 *简单模板bfs *编程应该为了方便理解,尽量提供接口 */ #include<cstdio> #include<algorithm> #includ ...
- poj 1324 状态压缩+bfs
http://poj.org/problem?id=1324 Holedox Moving Time Limit: 5000MS Memory Limit: 65536K Total Submis ...
- Pots POJ - 3414 (搜索+记录路径)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22688 Accepted: 9626 Special J ...
- kuangbin专题 专题一 简单搜索 Pots POJ - 3414
题目链接:https://vjudge.net/problem/POJ-3414 题意:给你两个杯子,分别容量为A(1),B(2)和一个C,C是需要经过下列操作,得到的一个升数.(1) FILL(i) ...
- poj 3414 Pots 【BFS+记录路径 】
//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...
- BFS POJ 3414 Pots
题目传送门 /* BFS:六种情况讨论一下,BFS轻松解决 起初我看有人用DFS,我写了一遍,TLE..还是用BFS,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...
- POJ 3414 Pots
Pots Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status ...
- 广搜+输出路径 POJ 3414 Pots
POJ 3414 Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13547 Accepted: 5718 ...
随机推荐
- 二叉树的非递归遍历C++实现
#include<iostream> #include<stdlib.h> #define maxsize 100 using namespace std; typedef s ...
- 02-Redis
今日内容 1. redis 1. 概念 2. 下载安装 3. 命令操作 1. 数据结构 4. 持久化操作 5. 使用Java客户端操作redis Redis 1. 概念:redis是一款高性能的NOS ...
- 使用DIV实现页面的遮罩效果
Div实现页面的遮罩 之前没动手搞过,项目有个需求刚好可以用到,就想着去试下,结果发现自己都理解的有问题了. 遮罩的实现是使用opacity或者IE下的filter滤镜来设置透明度的,而且一个div必 ...
- CodeForces 429B Working out DP
E - Working out Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Su ...
- Load_file 常用路径
load_file 常用路径 WINDOWS下: c:/boot.ini //查看系统版本 c:/windows/php.ini //php配置信息 c:/windows/my.ini //MYSQL ...
- Asp.net Core MVC(三)UseMvc设置路由
在家办公,下班继续看点东西,不废话,继续看MVC的路由. asp.net核心mvc的路由是建立在asp.net核心的路由之上的.通过终结点加载路由中间件的配置方式在此不细说了,(DOTNET Core ...
- sql的一般查询语句(增删改查中的查)
/*例子 判断规则 http://xxx.xxx/new.php?id=57 and 1=1 正确 http://xxx.xxx/new.php?id=57 and 1=2 错误 http://xxx ...
- python学习----文件的操作(2)
1.文件指针的操作 f=open("yesterday","r",encoding="utf-8") #文件句柄 #文件内指针的操作 pri ...
- ftp下载目录文件 不需要ftp脚本
ftp下载目录文件 不需要ftp脚本 wget ftp://192.168.1.37:21/checkpoints --ftp-user=ftpadmin --ftp-password=gaofeng ...
- STL中的Set和Map——入门新手篇
STL中的Set和Map 先来看一段网络上的文字描述: 上图是一段关于STL中Set集合的描述,同样的,也近似适合Map的描述.上述文字中,描述了最为重要的特征: Set和Map,底层调用了红黑树的结 ...