POJ 3414
http://poj.org/problem?id=3414
这是一个广搜的题目,不难,就是有些许麻烦。对于练习还是个不错的题目。
题意就是给你两个杯子,这两个杯子的容量分别为a和b,要你通过一些操作,量出c那么多的水来。
fill就是填满那个杯子。无论杯子是否油水
prou(2,1)就是从第二个杯子向第一个杯子里倒水,当第一个满了或者第二个杯子是空的为止。
drop就是把这个杯子里的水都给倒掉。
#include <cstdio>
#include <iostream>
#include <string>
#include <string.h>
#include <queue> using namespace std; #define judge(x,y) x>=0&&y>=0&&x<=a&&y<=b&&mark[x][y] //一个判断,也是减少代码量,虽然我这个代码写的还是比较渣,很多东西都要一个一个些。其实完全可以套用模板来搞。
int a,b,c,flog; struct note{
int x,y,step,pos,i; //step记录当前的步数,pos记录上一步。然后可以进行回溯吧。
char str[]; //进行储存这一步的具体操作。
}; bool mark[][]; //代表这个点是否以前出现过。 char ans[][];
queue<note>s; void bfs(int x,int y)
{
note p[],q;
while(!s.empty())
s.pop();
strcpy(p[].str,"ssss"); //我这个目的完全是为了然s不为空的,因为如果p[0]没有值的话,p[0]是进不了队列的。
p[].pos=,p[].x=,p[].y=,p[].step=,p[].i=;
s.push(p[]);
int k=;
while(!s.empty())
{
q=s.front();
s.pop();
if(q.x==c||q.y==c){ //当量出了那么多的水的时候,就输出答案。
flog=; //这个是为了确定找到了答案。
printf("%d\n",q.step); //
int m=;
strcpy(ans[m],q.str);
m++;
for(int i=q.pos;i!=;) //回溯步骤。
{
strcpy(ans[m],p[i].str);
m++;
i=p[i].pos;
}
while(m--) //倒叙输出答案。
printf("%s\n",ans[m]);
return ;
}
if(judge(a,q.y))
{
p[++k].x=a;
p[k].y=q.y;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"FILL(1)");
mark[a][q.y]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(judge(q.x,b))
{
p[++k].x=q.x;
p[k].y=b;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"FILL(2)");
mark[q.x][b]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(judge(,q.y))
{
p[++k].x=;
p[k].y=q.y;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"DROP(1)");
mark[][q.y]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(judge(q.x,))
{
p[++k].x=q.x;
p[k].y=;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"DROP(2)");
mark[q.x][]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(q.x+q.y>=a&&judge(a,q.y+q.x-a))
{
p[++k].x=a;
p[k].y=q.y+q.x-a;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"POUR(2,1)");
mark[a][q.x+q.y-a]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(q.x+q.y<a&&judge(q.x+q.y,))
{
p[++k].x=q.x+q.y;
p[k].y=;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"POUR(2,1)");
mark[q.x+q.y][]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(q.x+q.y>=b&&judge(q.x+q.y-b,b))
{
p[++k].x=q.x+q.y-b;
p[k].y=b;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"POUR(1,2)");
mark[q.x+q.y-b][b]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(q.x+q.y<b&&judge(,q.x+q.y))
{
p[++k].x=;
p[k].y=q.x+q.y;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"POUR(1,2)");
mark[][q.x+q.y]=false;
p[k].step=q.step+;
s.push(p[k]);
}
}
} int main()
{
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
flog=;
memset(mark,true,sizeof(mark));
bfs(,);
if(!flog) printf("impossible\n");
}
return ;
}
POJ 3414的更多相关文章
- 【BFS】POJ 3414
直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...
- 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 ...
- POJ 3414 Pots(罐子)
POJ 3414 Pots(罐子) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 You are given two po ...
- poj 3414 Pots 【BFS+记录路径 】
//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...
- BFS POJ 3414 Pots
题目传送门 /* BFS:六种情况讨论一下,BFS轻松解决 起初我看有人用DFS,我写了一遍,TLE..还是用BFS,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...
- Pots POJ 3414
/* *POJ 3414 *简单模板bfs *编程应该为了方便理解,尽量提供接口 */ #include<cstdio> #include<algorithm> #includ ...
- Pots(POJ - 3414)【BFS 寻找最短路+路径输出】
Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...
- poj 3414 Pots ( bfs )
题目:http://poj.org/problem?id=3414 题意:给出了两个瓶子的容量A,B, 以及一个目标水量C, 对A.B可以有如下操作: FILL(i) fill the ...
随机推荐
- Yii2-Redis使用小记 - Cache(转)
前些天简单学习了下 Redis,现在准备在项目上使用它了.我们目前用的是 Yii2 框架,在官网搜索了下 Redis,就发现了yii2-redis这扩展. 安装后使用超简单,打开 common/con ...
- SQL 查询总结
参考资料: SELECT 查询语句格式与简单查询 SQL中distinct的用法 SQL 查询总结
- vim 中 也可以 直接安装 emmet 直接使用zen coding 生成 l指定个数的 lorem ipsum文字.
超链接的写法: 当作为链接的文字, 比较长时, 整个作为链接 就显得不是 很适合. 可以取其中的某一个单词 作为 超链接的 关键字:如: click here to continue emmet中如何 ...
- 【MongoDB】MongoDb的“not master and slaveok=false”错误及解决方法
链接mongodb报错如下 2016-03-14T16:26:00.912+0800 E QUERY [thread1] Error: listDatabases failed:{ "ok& ...
- 清北学堂模拟day6 花
[问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值. ...
- iframe 内联框架
Iframe - 设置高度和宽度 height 和 width 属性用于规定 iframe 的高度和宽度. 属性值的默认单位是像素,但也可以用百分比来设定(比如 "80%"). 实 ...
- html 框架
通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面. 本例演示:如何使用三份不同的文档制作一个垂直框架. <html> <frameset cols="25%,50% ...
- 微信公众平台回复链接可以直接访问,但不能是锚文字链接<a>标签
最近在学习微信公众平台开发,由于编辑模式和开发模式不可同时开启,在开发模式下如果访客发送关键字过来暂时无法实现关键词自动回复,客服人员先用链接网址直接回复订阅用户,但请注意不能是文字链接,即<a ...
- 第一节 HTML网页和CSS样式
1. 第一行 <!DOCTYPE html> 表明网页使用的是HTML5版本 2. 网页的head内容,包含了 title,meta. 3. 网页的标题 title,注意这个显示在浏览器的 ...
- Knockout.Js案例三单页面应用程序
<ul data-bind="foreach: folders"> <li data-bind="text: $data">& ...