【题目描述】

 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数,
最初,A和B桶都是空的,而C桶是装满牛奶的。有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。
写一个程序去帮助约翰找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。

【格式】

INPUT FORMAT:
(file milk3.in)
单独的一行包括三个整数A,B和C。
OUTPUT FORMAT:
(file milk3.out)
只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。

【分析】

直接上BFS就行了,注意判重。

 #include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
const int Max=;
#define hash(t) h[t.a][t.b][t.c]
using namespace std;
struct State{int a,b,c;}data;
bool h[][][],h_2[];//哈希表
int A,B,C,point=,ans[Max];
void bfs();
void check(State t);
int main()
{
//文件操作
freopen("milk3.in","r",stdin);
freopen("milk3.out","w",stdout);
scanf("%d%d%d",&A,&B,&C);
data.a=data.b=;data.c=C;//初始状态
bfs();
sort(ans,ans+point);
for (int i=;i<point;i++) printf("%d ",ans[i]);
return ;
}
void bfs()
{
memset(h,,sizeof(h));//初始化哈希表
memset(h_2,,sizeof(h_2));
queue<State>Q;
Q.push(data);
hash(data)=;
check(data);
while (!Q.empty())
{
State u=Q.front(),v;Q.pop();
v=u;
//倒满的
if (v.a>=B-v.b) {v.a-=B-v.b;v.b=B;if (hash(v)==) {Q.push(v);hash(v)=;check(v);}}v=u;
if (v.b>=A-v.a) {v.b-=A-v.a;v.a=A;if (hash(v)==) {Q.push(v);hash(v)=;check(v);}}v=u;
if (v.a>=C-v.c) {v.a-=C-v.c;v.c=C;if (hash(v)==) {Q.push(v);hash(v)=;check(v);}}v=u;
if (v.c>=A-v.a) {v.c-=A-v.a;v.a=A;if (hash(v)==) {Q.push(v);hash(v)=;check(v);}}v=u;
if (v.c>=B-v.b) {v.c-=B-v.b;v.b=B;if (hash(v)==) {Q.push(v);hash(v)=;check(v);}}v=u;
if (v.b>=C-v.c) {v.b-=C-v.c;v.c=C;if (hash(v)==) {Q.push(v);hash(v)=;check(v);}}v=u;
//倒不满
if (v.a<B-v.b) {v.b+=v.a;v.a=;if (hash(v)==) {Q.push(v);hash(v)=;check(v);}}v=u;
if (v.b<A-v.a) {v.a+=v.b;v.b=;if (hash(v)==) {Q.push(v);hash(v)=;check(v);}}v=u;
if (v.a<C-v.c) {v.c+=v.a;v.a=;if (hash(v)==) {Q.push(v);hash(v)=;check(v);}}v=u;
if (v.c<A-v.a) {v.a+=v.c;v.c=;if (hash(v)==) {Q.push(v);hash(v)=;check(v);}}v=u;
if (v.c<B-v.b) {v.b+=v.c;v.c=;if (hash(v)==) {Q.push(v);hash(v)=;check(v);}}v=u;
if (v.b<C-v.c) {v.c+=v.b;v.b=;if (hash(v)==) {Q.push(v);hash(v)=;check(v);}}v=u;
}
}
void check(State t)
{
if (t.a== && h_2[t.c]==)
{
ans[point++]=t.c;
h_2[t.c]=;
}
return;
}

【USACO 1.4.4】母亲的牛奶的更多相关文章

  1. 随手练——USACO 1.44 母亲的牛奶

    P1215 [USACO1.4]母亲的牛奶 Mother's Milk 洛谷 P1215:https://www.luogu.org/problemnew/show/P1215 解题思想:DFS 大一 ...

  2. 洛谷P1215 [USACO1.4]母亲的牛奶 Mother's Milk

    P1215 [USACO1.4]母亲的牛奶 Mother's Milk 217通过 348提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 ...

  3. P1215 [USACO1.4]母亲的牛奶 Mother's Milk

    P1215 [USACO1.4]母亲的牛奶 Mother's Milk 题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满 ...

  4. 母亲的牛奶(milk)

    母亲的牛奶(milk) 题目描述 农民约翰有三个容量分别是A.B.C升的桶,A.B.C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一个桶倒到另一个桶中,直 ...

  5. 母亲的牛奶(milk) (BFS)

    问题 A: 母亲的牛奶(milk) 时间限制: 1 Sec  内存限制: 64 MB提交: 14  解决: 8[提交][状态][讨论版] 题目描述 农民约翰有三个容量分别是A.B.C升的桶,A.B.C ...

  6. USACO 1.4.2 Mother's Mil 母亲的牛奶(DFS)

    Description 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装 ...

  7. luogu P1215 [USACO1.4]母亲的牛奶 Mother's Milk

    题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了 ...

  8. 洛谷 P1215 [USACO1.4]母亲的牛奶 Mother's Milk

    题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了 ...

  9. 【USACO 1.3.1】混合牛奶

    [题目描述] 由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要.帮助梅丽乳业找到最优的牛奶采购方案. 梅丽乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是不同的. ...

随机推荐

  1. 【HDOJ】3325 Arithmetically Challenged

    简单DFS. /* 3325 */ #include <iostream> #include <set> #include <cstdio> #include &l ...

  2. sed的选项与命令简要

    第一部分:sed命令选项 sed选项 说明 -n, --quiet, --silent 静默模式,取消将模式空间中的内容自动打印出来. -e script, --expression=script 以 ...

  3. 【转】通知 Toast详细用法(显示view)

    原文网址:http://www.pocketdigi.com/20100904/87.html 今天学习Android通知 Toast的用法,Toast在手机屏幕上向用户显示一条信息,一段时间后信息会 ...

  4. Delphi NativeXML 乱码的问题

    我遇到 NativeXML 在它的一个节点的属性上面写入属性,但是当读出的值中包含汉字的时候出现了乱码.检查代码如下 NativeXml := TNativeXml.Create; try Nativ ...

  5. workflow4.0学习资料

    http://www.cnblogs.com/foundation/archive/2010/04/03/1703809.html 2篇说明: WF4 Bata 2 WF4.0 RC 对比 Beta2 ...

  6. 动态规划——A 最大子段和

    A - 最大子段和 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  7. [置顶] ruby变量详解(收集+整理)

    ruby的变量有局部变量,全局变量,实例变量,类变量,常量. 1.局部变量 局部变量以一个小写字母开头或下划线开头 局部变量有局部作用域限制(比如一个block内),它的作用域起始于声明处,结束于该声 ...

  8. java 基础(匿名内部类)

    匿名内部类 特点:不对外公开,进行实现功能,继承类,继承抽象类,实现某个接口的匿名内部类,实现相应的方法 特别注意:匿名内部类,匿名指的是 ,new 关键字右边的那个对象--如继承,或是接口    { ...

  9. 2016最新cocoapods版本更新,以及多个版本的问题

    先删除之前的pod 在终端中执行下面命令. 删除目录下的podrm -rf /usr/local/bin/pod 执行gem list | grep cocoapods 查看所有与cocoapods相 ...

  10. Hard 不用+号实现两个数之和 @CareerCup

    例子: 759+674 1)不考虑进位:   323 2)只考虑进位:1110 3)两者之和:1433 递归求解c package Hard; /** * Write a function that ...