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 ...
随机推荐
- 2020牛客寒假算法基础集训营4 C : 子段乘积
C:子段乘积 考察点 : 线段树,尺取,乘法逆元 坑点 : 区间要做到不重不漏, long long 侃侃 : 这道题在比赛是写的尺取,但是写了半天发现不好处理除 0 问题(浮点错误),需要用到乘法逆 ...
- 2020-02-20Linux学习日记,第二天
在内容开始前请教一下博客园的大佬.编辑器中没有看到格式刷,要怎么不连续的选中内容给予想要的格式,有看到的麻烦私信解答一下,谢谢! ----------------------------------- ...
- 突破CRUD | 万能树工具类封装
0.学完本文你或许可以收获 感受一个树工具从初始逐步优化完善的过程 树工具封装的设计思考与实现思路 最后收获一款拿来即用的树工具源代码 对于前端树组件有一定了解和使用过的同学可直接跳跃到第3章节开始. ...
- 内部类(innerclasses)
一般情况下,我们把类定义成独立的单元.有些情况下,我们把一个类放在另一个类的内部定义为内部类. 内部类的作用: 1.内部类提供了更好的封装.只能让外部类直接访问,不允许同一个包中的其他类直接访问. 2 ...
- 量化投资学习笔记27——《Python机器学习应用》课程笔记01
北京理工大学在线课程: http://www.icourse163.org/course/BIT-1001872001 机器学习分类 监督学习 无监督学习 半监督学习 强化学习 深度学习 Scikit ...
- MyEclipse10下载安装破解及汉化内含jdk8u241及其帮助文档
下载MyEclipse10以及破解包 MyEclipse10: 提取码:020c 破解包 提取码:mycj 注:破解包内含有破解教程,很详细,这里就不多说了 MyEclipse10汉化 操作系统:wi ...
- 如何在SQL Server中生成和使用CRUD存储过程
在本文中,请参阅如何在SQL Server中生成和使用CRUD存储过程. 大多数数据库系统基于缩写CRUD调用的最简单的4种数据操作操作进行操作. 此首字母缩写词代表CREATE,READ,UPDAT ...
- TChart-图表的滚动与翻译
界面代码: object Form1: TForm1 Left = Top = Width = Height = Caption = 'Form1' Color = clBtnFace Font.Ch ...
- 12.python内置模块之sys模块介绍
python的sys模块是与python解释器交互的一个接口,提供对解释器使用或维护的一些变量的访问,即与解释器强烈交互的函数. sys模块的常用函数: 1.sys.argv:命令行参数列表.第一个元 ...
- 错误:EfficientDet网络出现"No boxes to NMS"并且mAP:0.0的解决方案
近日,在使用谷歌新推出来的一个网络EfficientDet进行目标检测训练自己的数据集的时候,出现了如下错误: 其中项目开源地址是:https://github.com/toandaominh1997 ...