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的更多相关文章

  1. 【BFS】POJ 3414

    直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...

  2. POJ 3414 Pots

    Pots Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  3. 广搜+输出路径 POJ 3414 Pots

    POJ 3414 Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13547   Accepted: 5718   ...

  4. POJ 3414 Pots(罐子)

    POJ 3414 Pots(罐子) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 You are given two po ...

  5. poj 3414 Pots 【BFS+记录路径 】

    //yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...

  6. BFS POJ 3414 Pots

    题目传送门 /* BFS:六种情况讨论一下,BFS轻松解决 起初我看有人用DFS,我写了一遍,TLE..还是用BFS,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...

  7. Pots POJ 3414

    /* *POJ 3414 *简单模板bfs *编程应该为了方便理解,尽量提供接口 */ #include<cstdio> #include<algorithm> #includ ...

  8. Pots(POJ - 3414)【BFS 寻找最短路+路径输出】

    Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...

  9. poj 3414 Pots ( bfs )

    题目:http://poj.org/problem?id=3414 题意:给出了两个瓶子的容量A,B, 以及一个目标水量C, 对A.B可以有如下操作: FILL(i)        fill the ...

随机推荐

  1. [MongoDB]mapReduce

    摘要 上篇文章介绍了count,group,distinct几个简单的聚合操作,其中,group比较麻烦一点.本篇文章将学习mapReduce的相关内容. 相关文章 [MongoDB]入门操作 [Mo ...

  2. 使程序在Linux下后台运行

    一.为什么要使程序在后台执行 我们计算的程序都是周期很长的,通常要几个小时甚至一个星期.我们用的环境是用putty远程连接到日本Linux服务器.所以使程序在后台跑有以下三个好处: 1:我们这边是否关 ...

  3. youku的视频代码放到网站上如何实现自适应

    由于是在博客编辑器里面编辑的内容,所以一直想通过CSS的方法来解决,可是上面的方式都有明显的缺陷,最终被迫采用脚本来控制列的高度,代码如下: <divstyle="text-align ...

  4. jquery左右链接类似frameset的插件

    一般在使用jquery的扩展的 ui方面的插件, 都要注意链接两个文件 一个是ui 相关的js文件 另一个是 ui相关的 css文件! 参考这个css布局 通常多个平行的items 都是用ul li来 ...

  5. 自定义列表dl的使用原因和场合

    为什么要使用自定义列表? dl和ol, ul的区别? 要正确理解dl的意图, 理解 dl的 "语义" ! 才能知道为什么要使用dl, 以及在什么时候/ 什么情况下使用 dl? dl ...

  6. Java 中浮点数---------BigDecimal和double(初探)

    为什么要使用 bigdecimal? 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了 ...

  7. JAVA常用时间操作类

    http://www.360doc.com/content/10/1210/17/2703996_76839640.shtml    在程序里面要获取当前的开始时间和结束时间,以及当前天所在的周的开始 ...

  8. Linux中postfix邮件服务器的搭建

    postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件.postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试.在 ...

  9. Ubuntu 14 常用“快捷键”,Ctrl + Alt + F1 进入终端,按 Ctrl + Alt + F7 回到界面

    Ubuntu中所谓 Super键,就是 Windows建,一般在键盘的 ctrl 和 alt 2个键之间,一个微软窗口的图标. 1.持续按住 Super键,会弹出“键盘快捷键”大全: 2.修改快捷键路 ...

  10. tcp三次握手与四次挥手