【BFS】POJ 3414
题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径。注意a,b互倒的时候能不能倒满,或者还有剩下的。
a->b || b->a || a->0 || b->0 || a->A || b->B (0<=a<=A&&0<=b<=B)
思路:虽说是BFS但是情况就这几种,分别写出来之后判断即可。输出路径可以用递归,我这里用了string来存。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <map>
using namespace std;
const int maxn = 1000+5;
char *S[3] ={"FILL","POUR","DROP"};
int A,B,C;
int vis[maxn][maxn];
struct node{
int a,b;
string opt[maxn]; //存路径再输出
int step ;
}ans;
bool check(node x){
if(x.a == C||x.b == C)
return true;
return false;
}
int bfs(){
queue<node>Q;
node p,t;
p.a = p.b = p.step = 0;
Q.push(p);
while(Q.size()){
p = Q.front();
Q.pop();
if(check(p)) {
ans = p;
return true;
}
//DROP(1)
if(!vis[0][p.b]){
t = p;
t.a = 0;
t.step++;
t.opt[t.step] = "DROP(1)";
Q.push(t);
vis[0][p.b] = 1;
}
//DROP(2)
if(!vis[p.a][0]){
t = p;
t.b = 0;
t.step++;
t.opt[t.step] = "DROP(2)";
Q.push(t);
vis[p.a][0] = 1;
}
//FILL(1)
if(!vis[A][p.b]){
t = p;
t.a = A;
t.step++;
t.opt[t.step] = "FILL(1)";
Q.push(t);
vis[A][p.b] = 1;
}
//FILL(2)
if(!vis[p.a][B]){
t = p;
t.b = B;
t.step++;
t.opt[t.step] = "FILL(2)";
Q.push(t);
vis[p.a][B] = 1;
}
//POUR(2,1)
if(!vis[p.b>(A-p.a)?A:(p.a+p.b)][p.b>(A-p.a)?(p.b-A+p.a):0]){
t = p;
t.a = p.b>(A-p.a)?A:(p.a+p.b);
t.b = p.b>(A-p.a)?(p.b-A+p.a):0;
t.step++;
t.opt[t.step] = "POUR(2,1)";
Q.push(t);
vis[t.a][t.b] = 1;
}
//POUR(1,2)
if(!vis[p.a>(B-p.b)?(p.a-B+p.b):0][p.a>(B-p.b)?B:(p.a+p.b)]){
t = p;
t.a = p.a>(B-p.b)?(p.a-B+p.b):0;
t.b = p.a>(B-p.b)?B:(p.a+p.b);
t.step++;
t.opt[t.step] = "POUR(1,2)";
Q.push(t);
vis[t.a][t.b] = 1;
}
}
return -1;
}
int main()
{
while(~scanf("%d%d%d",&A,&B,&C)){
memset(vis,0,sizeof(vis));
if(bfs()>0){
cout<<ans.step<<endl;
for(int i=1;i<=ans.step;i++)
cout<<ans.opt[i]<<endl;
}
else printf("impossible\n");
}
return 0;
}
【BFS】POJ 3414的更多相关文章
- 【BFS】POJ 3278
POJ 3278 Catch That Cow 题目:你要去抓一头牛,给出你所在的坐标和牛所在的坐标,移动方式有两种:要么前一步或者后一步,要么移动到现在所在坐标的两倍,两种方式都要花费一分钟,问你最 ...
- 【BFS】POJ 2251
POJ 2251 Dungeon Master 题意:有一个地图,三维,走的方向是上下,左右,前后.问你最小步数从起始点走到出口. 思路:三维的BFS,就是多加一组状态,需要细心(不细心如我就找了半个 ...
- 【bfs】 poj 3984 maze 队列存储
#include <iostream> #include <stdio.h> #include <cstring> #define Max 0x7f7f7f7f u ...
- poj3278-Catch That Cow 【bfs】
http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- 【BFS】HDU 1495
直达–> HDU 1495 非常可乐 相似题联动–>POJ 3414 Pots 题意:中文题,不解释. 思路:三个杯子倒来倒去,最后能让其中两个平分即可.可能性六种.判定的时候注意第三个杯 ...
- 【动态规划】POJ 1161 & ZOJ1463 & XMU 1033 Brackets sequence
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1033 http://poj.org/problem?id=1141 ZOJ目前挂了. ...
- 【bfs】抓住那头牛
[题目] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次 ...
- 【bfs】拯救少林神棍(poj1011)
Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...
- 【bfs】Knight Moves
[题目描述] 输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步. [输入] 首先输入一个nn,表示测试样例 ...
随机推荐
- 面localStorage用作数据缓存的简易封装
面localStorage用作数据缓存的简易封装 最近做了一些前端控件的封装,需要用到数据本地存储,开始采用cookie,发现很容易就超过了cookie的容量限制,于是改用localStorage,但 ...
- document封装一些常用的方法
/** * 批量修改元素样式 */ function css(domObj,styleArry){ for(var i=0;i<styleArry.length;i++){ domObj.sty ...
- linQ学习笔记之一
linq解决的问题 1.编程语言中的数据类型与数据库中的数据类型形成的两套体系 2.SQL编码体验落后 3.SQL和XML都有各自的查询语言,而对象没有自己的查询语言 linq简单的集合查询和fore ...
- oracle 学习笔记(四)
1. SQL(高级查询) 1.1. 子查询 1.1.1. 子查询在WHERE子句中 在SELECT查询中,在WHERE查询条件中的限制条件不是一个确定的值,而是来自于另外一个查询的结果.为了给查询提供 ...
- mina中游戏客户端服务端数据交互流程
====================================================================================CLIENT encode ...
- Nodejs实现简单的反向代理
var http = require('http'), httpProxy = require('http-proxy'); // 新建一个代理 Proxy Server 对象 var proxy = ...
- java实现记住密码功能(利用cookie)
<br> <input type="text" id="userName" name="userName" value=& ...
- RecyclerView解密篇(一)
一.前言 RecyclerView是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视 ...
- 多预览小图焦点轮播插件lrtk
多预览小图焦点轮播插件lrtk // JavaScript Document $(document).ready(function(){ //$('#select_btn li:first').css ...
- 建表过程-列名&列类型&修改表B
怎么建表? 主键 名称 重量 价格 生产日期 保质期 产地 种类 分析:我们只要把第一行的表头建好后,这张表也就完成了. 术语:建表的过程就是声明字段过程 ...