典型的倒水问题:
即把两个水杯的每种状态视为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# 本质论 第一章 C#概述
学习新语言最好的办法就是动手写代码. 库(或称为类库)的文件扩展名是.dll,其中dll代表"动态链接库(Dynamic Link Library)". 不要在标识符中使用单词缩写 ...
-
java之通过反射,来获得某对象的所有方法(类方法提取器)
参考Thinging in Java 在编程时, 如果不记得一个类是否有某个方法,或者不知道一个类究竟能做些什么,而又不想通过索引或 类的层次结构去查找jdk文档,这时通过反射的小工具能节省很多时间. ...
-
java基础篇---I/O技术
java基础篇---I/O技术 对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...
-
BNUOJ-29365 Join in tasks 简单数学
题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29365 首先排序,然后维护一个后缀,等差求下和就可以了.. //STATUS:C++_AC ...
-
OpenCV成长之路:直线、轮廓的提取与描述
http://ronny.blog.51cto.com/8801997/1394139 OpenCV成长之路:直线.轮廓的提取与描述 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...
-
Main Thread Checker 问题解决
1. without a return value https://developer.apple.com/documentation/code_diagnostics/main_thread_che ...
-
洛谷P1434滑雪题解及记忆化搜索的基本步骤
题目 滑雪是一道dp及记忆化搜索的经典题目. 所谓记忆化搜索便是在搜索的过程中边记录边搜索的一个算法. 当下次搜到这里时,便直接使用. 而且记忆化搜索一定要满足无后效性,为什么呢,因为如果不满足无后效 ...
-
C#字符串转换为float
1.解决不同计算机上,区域和时间不同而引起的转换问题(如:“123.456”报“字符串格式不正确”问题) //解决区域.语言变更引起的“识别不出小数点问题”如:转换时“123.456”转换时不认识&q ...
-
Docker学习笔记之浅谈虚拟化和容器技术
0x00 概述 相信所有对 Docker 有所耳闻的朋友都知道,它是一款以容器虚拟化技术为基础的软件,因此在了解有关 Docker 的概念知识和使用方法之前,虚拟化和容器技术是我们不可或缺的基础知识. ...
-
Codeforces 785E. Anton and Permutation
题目链接:http://codeforces.com/problemset/problem/785/E 其实可以CDQ分治... 我们只要用一个数据结构支持单点修改,区间查询比一个数大(小)的数字有多 ...