poj1066 Jugs

http://poj.org/problem?id=1606

解题思路:本题可以用数学方法解得,最易理解,常规的解法是搜索。直接用接近模拟的广度优先搜索即可过。

给两个容器,给出最大容量(ca,cb)和目标水量n,可以执行6种操作:

(1)把A容器灌满水,操作名:fill A;

(2)把B容器灌满水,操作名:fill B;

(3)把A容器中的水倒出去,管它倒到哪里去,反正不在这两个容器里面,操作名:empty A;

(4)把B容器中的水倒出去,操作名:empty B;

(5)把A容器中的水倒到B容器中去,要是B容器装不下A容器中的水,则把B容器倒满,剩下的水留在A容器中,操作名:pour A B;

(6)把B容器中得水倒到A容器中去,,操作名:pour B A ;

要求最后留在B容器中的水量为n。

按操作的顺序输出操作名,使B容器中的水量为n。

直接用广度优先搜索即可,只是搜索时的搜索树,不是经典地图搜索中的四个方向,而是6种操作方法。

(1)定义ca,cb,n,分别用于A容器,B容器的最大装水量和目的水量;定义一个二维数组flag[1002][1002],用于存储A容器B容器装的水的量用于搜索是的状态判重,定义一个串数组存储6种操作名,用于后面输出操作名;定义一个结构体,内涵a,b,s,分别表示A容器,B容器上次操作后的装水量,和以前所处理的操作的操作名在用于输出的操作名的数组中的下标。

(2)对于每组测试案例,直接输入三个值,直到文件结束,程序终止。

(3)对于每组测试数据,进行广度优先搜索,每次搜索都分成6种操作方法对两个容器中的水量进行处理,当B容器中的水量为n时停止搜索,按照当前处理的状态结构体中的S串输出操作顺序的操作名即可。

(4)别忘了在每组数据最后输出“success”。

由于是用广度优先搜索算法进行搜索的,故搜索到的操作次数必是最小的,无需再判断次数。

注:本题是特殊对比方式判正误,即使样例输入得到的的答案和样例输出的内容有所不用也不要紧,只要后面B容器中得水的量是n的即可。

12052890 20114045007 1606 Accepted 4100K 16MS C++ 1883B 2013-08-29 19:47:08
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<queue>
using namespace std;
int ca,cb,n;
int flag[1002][1002]; //状态标记,用于判重
string out[]={"fill A","fill B","empty A","empty B","pour A B","pour B A"}; //6个操作名
struct node
{
int a;
int b;
string s;
};
void bfs()
{
memset(flag,0,sizeof(flag));
node now,next;
queue<node> q;
now.a=0;
now.b=0;
flag[0][0]=1;
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
if(now.b==n) //B容器中得水量为n时,搜索成功
 {
for(int i=0;i<now.s.size();i++)
cout<<out[now.s[i]-'0']<<endl;
return;
}
//fill A
next.a=ca;
next.b=now.b;
next.s=now.s+'0';
if(!flag[next.a][next.b])flag[next.a][next.b]=1,q.push(next);
next.a=now.a;
next.b=cb;
next.s=now.s+'1';
if(!flag[next.a][next.b])flag[next.a][next.b]=1,q.push(next);
//empty A
next.a=0;
next.b=now.b;
next.s=now.s+'2';
if(!flag[next.a][next.b])flag[next.a][next.b]=1,q.push(next);
//empty B
next.a=now.a;
next.b=0;
next.s=now.s+'3';
if(!flag[next.a][next.b])flag[next.a][next.b]=1,q.push(next);
//pour A B
if(cb-now.b>=now.a)next.a=0,next.b=now.b+now.a; //若B容器中还可装入的水量大于等于A容器中当前水量,则把A容器中的水全部倒入B容器中
else next.a=now.a-cb+now.b,next.b=cb; //否则,把B容器倒满,剩下的水留在A容器中
next.s=now.s+'4';
if(!flag[next.a][next.b])flag[next.a][next.b]=1,q.push(next);
// pour B A
if(ca-now.a>=now.b)next.b=0,next.a=now.a+now.b; //同上
else next.b=now.b-ca+now.a,next.a=ca;
next.s=now.s+'5';
if(!flag[next.a][next.b])flag[next.a][next.b]=1,q.push(next);
}
}
int main()
{
while(scanf("%d%d%d",&ca,&cb,&n)!=EOF)
{
bfs();
printf("success\n");
}
return 0;
}

poj1066 Jugs的更多相关文章

  1. ZOJ 1005:Jugs(思维)

    Jugs Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge In the movie "Die Har ...

  2. 【Acm】算法之美—Jugs

    题目概述:Jugs In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted wi ...

  3. POJ1066线段交点

    POJ1066 题意:给出一个100*100的正方形区域,通过若干连接区域边界的线段将正方形区域分割为多个不规则多边形小区域,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径 ...

  4. Jugs(回溯法)

    ZOJ Problem Set - 1005 Jugs Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge In ...

  5. 『ACM C++』HDU杭电OJ | 1415 - Jugs (灌水定理引申)

    今天总算开学了,当了班长就是麻烦,明明自己没买书却要带着一波人去领书,那能怎么办呢,只能说我善人心肠哈哈哈,不过我脑子里突然浮起一个念头,大二还要不要继续当这个班委呢,既然已经体验过就可以适当放下了吧 ...

  6. poj1066(叉乘的简单应用)

    做完了才发现,好像没有人和我的做法一样的,不过我怎么都觉得我的做法还是挺容易想的. 我的做法是: 把周围的方框按顺时针编号,然后对于每一条边,如果点出现在边的一侧,则把另一侧所有的点加1,这样最后统计 ...

  7. 九度OJ 1147:Jugs(罐子) (模拟、游戏)

    时间限制:1 秒 内存限制:32 兆 特殊判题:是 提交:243 解决:200 题目描述: In the movie "Die Hard 3", Bruce Willis and ...

  8. UVA571 - Jugs(数论)

    UVA571 - Jugs(数论) 题目链接 题目大意:给你A和B的水杯.给你三种操作:fill X:把X杯里面加满水.empty X:把X杯中的水清空.pour X Y 把X的水倒入Y中直到一方满或 ...

  9. POJ 1606 Jugs

    Jugs Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4280   Accepted: 2533   Special Ju ...

随机推荐

  1. maven仓库--私服(Nexus的配置使用)

    maven--私服的搭建(Nexus的使用)和注意的问题 私服是什么 私服,私有服务器,是公司内部Maven项目经常需要的东东,不总结一下,不足以体现出重视.Nexus是常用的私用Maven服务器,一 ...

  2. IntelliJ idea 14 集成 tomcat 7

    来到公司第一个任务就是先把web项目跑起来,所以如何在IntelliJ idea14中把Tomcat集成起来也是个不小的问题. 首先确认你的idea 14 不是 Communit Edition 社区 ...

  3. C++将文件内容一次性读入内存

    结合字符串流,将文件中的内容一次性读入内存,代码如下: #include <string> using std::ostringstream; using std::ifstream; u ...

  4. block 解析 - 形参变量

    block形参 之前漏了一篇block形参的介绍,这里给补上. block形参就是定义block带的参数,和函数的参数使用一样,我们可以在block随意使用修改block形参. 我们来看个例子: 我们 ...

  5. 跨平台运行ASP.NET Core 1.0(转载)

    前言 首先提一下微软更名后的叫法: ASP.NET 5 更名为 ASP.NET Core 1.0 .NET Core 更名为 .NET Core 1.0 Entity Framework 7 更名为  ...

  6. Linux命令: chown

    touch auth.log root@ubuntu:/work# ls -l auth.log -rw-r--r-- 1 root root 0 Feb 18 19:27 auth.log chow ...

  7. 关于php判断中文字符的问题

    在网上找了好多例子,还是这个靠谱点: UTF-8匹配: 在javascript中,要判断字符串是中文是很简单的.比如: var str = "php编程"; if (/^[\u4e ...

  8. 如何判断是否安装了VC RUNTIME

    先得说下GUID,它是Globally Unique Identifier的简称,中文翻译为“全球唯一标示符”,在Windows系统中也称之为Class ID,缩写为CLSID.对于不同的应用程序,文 ...

  9. Deamon Thread 讲解

    The daemon thread's life cycle is same with the life cycle of the application which starts this daem ...

  10. 关于android中postDelayed方法的讲解

    这是一种可以创建多线程消息的函数使用方法:1,首先创建一个Handler对象 Handler handler=new Handler(); 2,然后创建一个Runnable对象Runnable run ...