POJ - 3414 bfs [kuangbin带你飞]专题一
状态搜索,每种状态下面共有六种选择,将搜索到的状态保存即可。
d[i][j]表示状态A杯中水i升,B杯中水j升,总状态数量不会超过A杯的容量 * B杯的容量。
AC代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 100 + 5;
struct node{
int A, B; //当前状态
string op;
node(){
}
node(int a, int b, string op):A(a), B(b), op(op){
}
}pre[maxn][maxn];
int d[maxn][maxn], a, b, c;
void print(int x, int y){
//printf("%d %d\n", x, y);
int px = pre[x][y].A, py = pre[x][y].B;
if(px == -1 && py == -1) return;
print(px, py);
cout << pre[x][y].op << endl;
}
int bfs(){
int cup[] = {a, b};
memset(d, -1, sizeof(d));
d[0][0] = 0;
queue<node>q;
q.push(node(0, 0, ""));
pre[0][0] = node(-1, -1, "");
while(!q.empty()) {
node p = q.front();
q.pop();
if(p.A == c || p.B == c){
printf("%d\n", d[p.A][p.B]);
print(p.A, p.B);
return 1;
}
int w[] = {p.A, p.B};
for(int i = 0; i < 2; ++i)
for(int j = 0; j < 2; ++j) {
if(i == j) continue;
//Fill
w[0] = p.A, w[1] = p.B;
w[i] = cup[i];
if(d[w[0]][w[1]] == -1) {
d[w[0]][w[1]] = d[p.A][p.B] + 1;
string op = "";
if(i == 0) op = "FILL(1)";
else op = "FILL(2)";
q.push(node(w[0], w[1], ""));
pre[w[0]][w[1]] = node(p.A, p.B, op);
}
//Drop
w[0] = p.A, w[1] = p.B;
w[i] = 0;
if(d[w[0]][w[1]] == -1) {
d[w[0]][w[1]] = d[p.A][p.B] + 1;
string op = "";
if(i == 0) op = "DROP(1)";
else op = "DROP(2)";
q.push(node(w[0], w[1], ""));
pre[w[0]][w[1]] = node(p.A, p.B, op);
}
//Pour
w[0] = p.A, w[1] = p.B;
int pour = min(w[i], cup[1 - i] - w[1 - i]);
w[i] -= pour, w[1 -i] += pour;
if(d[w[0]][w[1]] == -1) {
d[w[0]][w[1]] = d[p.A][p.B] + 1;
string op = "";
if(i == 0) op = "POUR(1,2)";
else op = "POUR(2,1)";
q.push(node(w[0], w[1], ""));
pre[w[0]][w[1]] = node(p.A, p.B, op);
}
}
}
return 0;
}
int main(){
while(scanf("%d%d%d", &a, &b, &c) == 3){
if(!bfs()) printf("impossible\n");
}
return 0;
}
如有不当之处欢迎指出!
POJ - 3414 bfs [kuangbin带你飞]专题一的更多相关文章
- POJ - 2251 bfs [kuangbin带你飞]专题一
立体bfs,共有六个方向: const int dx[] = {0,0,1,-1,0,0}; const int dy[] = {1,-1,0,0,0,0}; const int dz[] = {0, ...
- POJ - 3984 bfs [kuangbin带你飞]专题一
bfs搜索过程中将路径保存下即可. AC代码 #include<cstdio> #include<cstring> #include<algorithm> #inc ...
- HDU - 3533 bfs [kuangbin带你飞]专题二
看了好久的样例才看懂. 题意:有一个人要从(0,0)走到(n,m),图中有k个碉堡,每个碉堡可以向某个固定的方向每隔t秒放一次炮,炮弹不能穿越另一个碉堡,会被阻挡.人在移动的过程中不会被炮弹打到,也就 ...
- HDU - 2102 A计划 (BFS) [kuangbin带你飞]专题二
思路:接BFS判断能否在限制时间内到达公主的位置,注意如果骑士进入传送机就会被立即传送到另一层,不会能再向四周移动了,例如第一层的位置(x, y, 1)是传送机,第二层(x, y, 2)也是传送机,这 ...
- UVA - 11624 多点bfs [kuangbin带你飞]专题一
题意:某人身陷火场,总有k个点着火,着火点可向四周扩散,问此人能否逃离. 思路:可能有多个着火点,以这些着火点作为起点进行bfs,得到整个火场的最短距离,然后又以人所在坐标作为起点进行bfs,得到该人 ...
- FZU - 2150 bfs [kuangbin带你飞]专题一
题意:两个人玩很变态的游戏,将一个草坪的某两个点点燃,点燃的草坪可以向上下左右四个方向扩散,问能否将整块草坪上面的草都点燃.如果能,输出最短时间(^_^他们就能玩更变态的游戏了),如果不能,输出-1. ...
- HDU - 2612 bfs [kuangbin带你飞]专题一
分别以两个人的家作为起点,bfs求得到每个KFC最短距离.然后枚举每个KFC,求得时间之和的最小值即可. 此题不符合实际情况之处: 通过了一个KFC再去另一个KFC可以吗? 出题人都没好好想过吗? ...
- HDU - 1495 bfs [kuangbin带你飞]专题一
模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...
- POJ - 3087 模拟 [kuangbin带你飞]专题一
模拟洗牌的过程,合并两堆拍的方式:使先取s2,再取s1:分离成两堆的方式:下面C张放到s1,上面C张到s2.当前牌型与第一次相同时,说明不能搜索到答案. AC代码 #include<cstdio ...
随机推荐
- JS中数组的常用方法
首先,在开始前我们先了解一下什么是数组. 1.什么是数组? 数组就是一组数据的集合,其表现形式就是内存中的一段连续的内存地址,数组名称其实就是连续内存地址的首地址.说白了它就是将一堆数据按照一定的顺序 ...
- linux相关概念
最近这段时间玩Linux比较多,前面我也转载了好多的相关的Linux指令.这里自己关于Linux概念来自己整理一下. 首先我们应该知道Linux到底是什么? 我们知道Linux这玩意儿是在计算机上面运 ...
- vi使用手册
VI是unix上最常用的文本编辑工具,我自己电脑上面也装了VIM编辑器,这个据称是程序员码字神器我实在没觉得那里舒服了,所以又用回了自己的Sublime.这里整理下vi常用操作,如果以后直接在Linu ...
- WebSphere--安装与配置
对于任何软件,都需要一些计划和具体步骤以确保成功安装.对于安装与配制 WebSphere应用服务器及其组件也是如此.下面介绍在Windows NT 上安装与配置WebSphere应用服务器 1 ...
- 《struts2》:指定多个配置文件和默认Action
转载:http://m.blog.csdn.net/article/details?id=51212968
- MySQL基于binlog主从复制
MySQL复制介绍 默认情况 下复制是异步进行的,从库也不需要一直连接到主库来同步数据 MySQL复制的数据粒度可以是主实例上所有的数据库,也可以是指定的一个或多个数据库 ,也可以是一个数据库里的指定 ...
- 【转】DELL R710服务器可以安装的VMWare ESX Server 4.1 全套下载带注册码
随着R710的停产,R720随之面世,但DELL R720服务器只支持vmware esxi5.0以上,DELL客户经理给了一套系统安装后序列号无法解决,还是用4.1好了,却又发现怎么都无法安装.按网 ...
- 【ASP.NET Core】MVC中自定义视图的查找位置
.NET Core 的内容处处可见,刷爆全球各大社区,所以,老周相信各位大伙伴已经看得不少了,故而,老周不考虑一个个知识点地去写,那样会成为年度最大的屁话,何况官方文档也很详尽.老周主要扯一下大伙伴们 ...
- linux下硬盘uuid查看及修改设置
查看硬盘UUID 方法一:ls -l /dev/disk/by-uuid方法二:blkid /dev/sdb1 修改硬盘UUID: uuidgen 会返回一个合法的 uuid,结合 tune2fs 可 ...
- 为Ghost博客扩展代码高亮、数学公式、页面统计、评论
前几天捣鼓了一下博客首页,接下来再丰富一下博客页面的功能与内容.由于我所使用的Ghost博客专注于轻量简洁,因此标题中提到的功能在Ghost中默认均不支持.下面将逐个介绍一下如何为Ghost扩展这些功 ...