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. myeclipse自动生成注释

    myeclipse自动生成注释 在使用Eclipse编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的,例如其中author的属性值. 我们可以在Eclipse中进行设置自己希望显示 ...

  2. SAX方式解析XML

    sax解析分为以下几步: 1 获取一个saxparserfactory 2 获取一个解析器 3 创建handler对象,这个myHandler是继承了DefaultHandler的一个类,这个实现类里 ...

  3. 高级UIKit-07(AVAudioPlayer)

    [day09-1-AVAudioPlayer]:播放音乐案例 实现多媒体需要准备以下两点: 需要引入一个框架AVFoundation.framework 然后引入#import <AVFound ...

  4. 03-Foundation中NSMutableArray遍历、复制和排序

    目录: 一.NSString补充 二.NSMutableArray可变数组 三.遍历 四.NSArray支持的新语法 五.数组复制 六.数组的排序 SDK.API.Foundation.Cocoa是什 ...

  5. C# 仿金山毒霸启动和关闭淡入淡出效果

    原文 C# 仿金山毒霸启动和关闭淡入淡出效果 01 #region 窗体关闭效果 02   03 #region 私有方法 04 [DllImportAttribute("user32.dl ...

  6. CCIE路由实验(6) -- 组播Multicasting

    1.组播IGMP的各种情况2.PIM Dense-Mode3.PIM Sparse-Mode4.PIM双向树和SSM5.动态RP之auto-rp6.动态RP之BSR7.Anycast RP8.域间组播 ...

  7. ecosphere是什么意思_ecosphere的翻译_音标_读音_用法_例句 - 必应 Bing 词典

    ecosphere是什么意思_ecosphere的翻译_音标_读音_用法_例句 - 必应 Bing 词典 ecosphere

  8. 基于Qt的FreeType字体轮廓解析

    一.本文目的 以前的文档中.详细的介绍了FreeType开源字体引擎库的基础知识.基本用法.但并未详细的阐明在TurboCG中.是如何解析出一个文字的轮廓的,本文集中阐述.怎么样使用FreeType开 ...

  9. OFBIZ分享:利用Nginx +Memcached架设高性能的服务

    近年来利用Nginx和Memcached来提高站点的服务性能的作法,如一夜春风般的遍及大江南北,越来越多的门户站点和电子商务平台都採用它们来为自己的用户提供更好的服务体验.如:网易.淘宝.京东.凡客等 ...

  10. 苹果2014WWDC亮点之个人浅见

    这届WWDC给人的整体感觉是融合.设备(手机IOS)和设备(电脑MAC OS X)的融合,人与信息的融合(SpotLight),人与代码的融合(Swift),人与人和设备的融合(HomeKit),接下 ...