状态搜索,每种状态下面共有六种选择,将搜索到的状态保存即可。

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带你飞]专题一的更多相关文章

  1. 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, ...

  2. POJ - 3984 bfs [kuangbin带你飞]专题一

    bfs搜索过程中将路径保存下即可. AC代码 #include<cstdio> #include<cstring> #include<algorithm> #inc ...

  3. HDU - 3533 bfs [kuangbin带你飞]专题二

    看了好久的样例才看懂. 题意:有一个人要从(0,0)走到(n,m),图中有k个碉堡,每个碉堡可以向某个固定的方向每隔t秒放一次炮,炮弹不能穿越另一个碉堡,会被阻挡.人在移动的过程中不会被炮弹打到,也就 ...

  4. HDU - 2102 A计划 (BFS) [kuangbin带你飞]专题二

    思路:接BFS判断能否在限制时间内到达公主的位置,注意如果骑士进入传送机就会被立即传送到另一层,不会能再向四周移动了,例如第一层的位置(x, y, 1)是传送机,第二层(x, y, 2)也是传送机,这 ...

  5. UVA - 11624 多点bfs [kuangbin带你飞]专题一

    题意:某人身陷火场,总有k个点着火,着火点可向四周扩散,问此人能否逃离. 思路:可能有多个着火点,以这些着火点作为起点进行bfs,得到整个火场的最短距离,然后又以人所在坐标作为起点进行bfs,得到该人 ...

  6. FZU - 2150 bfs [kuangbin带你飞]专题一

    题意:两个人玩很变态的游戏,将一个草坪的某两个点点燃,点燃的草坪可以向上下左右四个方向扩散,问能否将整块草坪上面的草都点燃.如果能,输出最短时间(^_^他们就能玩更变态的游戏了),如果不能,输出-1. ...

  7. HDU - 2612 bfs [kuangbin带你飞]专题一

    分别以两个人的家作为起点,bfs求得到每个KFC最短距离.然后枚举每个KFC,求得时间之和的最小值即可. 此题不符合实际情况之处:  通过了一个KFC再去另一个KFC可以吗? 出题人都没好好想过吗? ...

  8. HDU - 1495 bfs [kuangbin带你飞]专题一

    模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...

  9. POJ - 3087 模拟 [kuangbin带你飞]专题一

    模拟洗牌的过程,合并两堆拍的方式:使先取s2,再取s1:分离成两堆的方式:下面C张放到s1,上面C张到s2.当前牌型与第一次相同时,说明不能搜索到答案. AC代码 #include<cstdio ...

随机推荐

  1. 易趣:使用MongoDB创建关键业务的多数据中心应用

    eBay:使用MongoDB创建关键业务的多数据中心应用 作为全球前十的零售品牌,eBay的活跃用户有一亿七千多万,并拥有跨越全世界190个市场的10亿购物清单,这样的规模下,eBay绝对不允许出现宕 ...

  2. JFreeChart绘制折线图实例

    JFreeChart是JAVA平台上的一个开放的第三方图表绘制类库.只要下载JFreeChart的类库,导入项目即可使用.下面是一个绘制折线图的实例.各处注释都已经写的比较清晰了. package c ...

  3. Effective Java 之-----for-each循环优于传统的for循环

    如下代码: enum Face {1,2,3,4,5,6}: ...... Collection<Face> faces = Array.asList(Face.values); for( ...

  4. 完全总结bash中的条件判断test [ [[ 使用

    在bash脚本编程中,我们经常做一些条件判断, 我们主要用到了三种,test,单中括号,双中括号 经常有看到不同的写法,如: [ $? –eq ] [[ $myvar == “mysql” ]] te ...

  5. 基于Vue2写的一个有关美食项目

    刚学Vue练习的一个项目 使用Vue2+vue-router+vuex+axios+webpack router使用了默认的hash模式 引入了高德地图和element-ui 项目地址点击这里 演示地 ...

  6. ABP 多租户 对应多数据库 租户启动报错

    什么是多租户? “软件多租户是指一个软件体系结构,其中一个软件实例在一个服务器上运行,并为多个租户提供服务*租户是一组共享具有软件实例特定权限的公共访问权限的用户. 架构中,软件应用程序旨在为每个租户 ...

  7. Linux 虚拟机忘记root密码

    Linux 虚拟机忘记root密码可以按照下面的步骤重新设置密码: 1.在grub界面,也就是有press any key的那个界面,按下任意键 2.键入e,出现三行文字,按上下键选择kernel那一 ...

  8. 《深入理解Java虚拟机》学习笔记(二)

    垃圾回收的前提是判断对象是否存活,对象不再存活时将会被回收,下面是2种判断的方法. 引用计数法: 主流的Java虚拟机并没有使用引用计数法来管理内存,重要的原因就是循环引用的问题难以解决. 可达性分析 ...

  9. UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]

    #274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...

  10. 原生js贪吃蛇

    <!DOCTYPE html> <html> <head> <title></title> <meta charset="u ...