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. RabbitMQ安装后不能运行 Error: unable to connect to node nodedown

    本地安装RabbitMQ后总是不能正常的使用.. 命令行输入 rabbitMQctl Status  报下边的错 Error: unable to connect to node 'rabbit@YO ...

  2. Log4Net使用方法

    项目里都会用到日志记录..特别是在本地跑的欢畅..一上服务器就嗝屁的时候..日志会帮你大忙.. Log4net算是一种应用的最广泛的日志记录方式了..下面来简略的说下他的用法.. 先下载log4net ...

  3. 二叉排序树(Binary Sort Tree)

    参考文章:http://blog.csdn.net/ns_code/article/details/19823463 不过博主的使用第一种方法操作后的树已经不是二叉排序树了,值得深思!! #inclu ...

  4. apache禁止访问文件或目录执行权限、禁止运行脚本PHP文件的设置方法

      <Directory "要去掉PHP执行权限的目录路径,例如:D:/piaoyun.cc/upload"> ErrorDocument 404 /404/404.h ...

  5. 单选框的回显c:if

    <input type="radio" name="sex" value="boy" <c:if test="${te ...

  6. Hello World(本博客启程篇)

    Hello World 作为本博客第一篇日志,作为程序员,无论走到哪里,做什么事,必须先输出这句话. 一个想法 从今天3月份到现在一直在学技术,过程中坑的解决.知识的总结以及想法等都写到了" ...

  7. linux 关机命令总结

    linux下常用的关机命令有:shutdown.halt.poweroff.init:重启命令有:reboot.下面本文就主要介绍一些常用的关机命令以及各种关机命令之间的区别和具体用法. 首先来看一下 ...

  8. Linux服务器管理: 系统的进程管理ps命令

    源码包:2015-06-30 12:11:25 首先我们可以通过网络去下载相应的源码包:我们以apache为例: [root@localhostA1 opt]# wget http://archive ...

  9. 希望各位博友能对我的自我介绍提出意见(要面试IBM的应用开发工程师,本科应届生一枚)

    面试官你好,首先我非常高兴能参加今天的面试. 我叫XXX(我名字里面有光宗耀祖),也许父母希望我光宗耀祖吧,所以给我起这样的名字.我的家乡山西太原,本科就读于XX大学,专业是信息与计算科学. 我今天要 ...

  10. 低版本IE浏览器 input元素出现叉叉的情况

    都说是IE10之上的浏览器才有这个问题,恰巧我IE10之上都没有问题,反而是低版本的浏览器出现了这个问题.作为一个凭证,我先放一张图片在这里面. 之前无意中解决过这个问题,如今复现确实是没有解决,网上 ...