【题目描述】

 农民约翰有三个容量分别是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. PL/SQL developer export/import (转)

    export/import图标为灰色:原因:相关应用程序没有关联菜单栏 --> Tools --> Import Tables... --> Oracle Import Export ...

  2. Hibernate 配置详解(5)

    9) hibernate.batch_fetch_style: 该配置是hibernate4.2.0新添加的,使用这个设置可以配置hibernate在做batch-fetch的时候,生成SQL的策略. ...

  3. weblogic服务器保存图片失败解决办法

    日志中报错如下: java.lang.NoClassFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment 解决办法 ...

  4. Light OJ 1017 - Brush (III)

    题目大意:     在一个二维平面上有N个点,散落在这个平面上.现在要清理这些点.有一个刷子刷子的宽度是w. 刷子上连着一根绳子,刷子可以水平的移动(在X轴方向上).他可以把刷子放在任何一个地方然后开 ...

  5. 如何在svn系统中使用git

    如果正在使用svn,打算换到git,又暂时不想放弃已有的svn代码库,可以选择git-svn.说一说我自己从svn到git的经验吧. 开始 安装最新版本的git,从git 1.5.3以后支持git-s ...

  6. 使用开源软件sentry来收集日志

    原文地址:http://luxuryzh.iteye.com/blog/1980364 对于一个已经上线的系统,存在未知的bug或者运行时发生异常是很常见的事情,随之而来的几点需求产生了: 1.系统发 ...

  7. RCMTM _百度百科

    RCMTM _百度百科 RCMTM

  8. Qt Quick 事件处理之信号与槽

    前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本的语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经能够完毕 ...

  9. dubbo(soa分布式)与cobar(mysql分布式)

    http://www.jianshu.com/p/0dde591f21d0 (Dubbo编译不是个顺利的事) Cobar是提供关系型数据库(MySQL)分布式服务的中间件,它可以让传统的数据库得到良好 ...

  10. oracle中imp命令具体解释

    oracle中imp命令具体解释 Oracle的导入有用程序(Import utility)同意从数据库提取数据,而且将数据写入操作系统文件.imp使用的基本格式:imp[username[/pass ...