【USACO 1.4.4】母亲的牛奶

【题目描述】

农民约翰有三个容量分别是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就行了,注意判重。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <queue>
 7 const int Max=10000;
 8 #define hash(t) h[t.a][t.b][t.c]
 9 using namespace std;
10 struct State{int a,b,c;}data;
11 bool h[21][21][21],h_2[21];//哈希表
12 int A,B,C,point=0,ans[Max];
13 void bfs();
14 void check(State t);
15 int main()
16 {
17     //文件操作
18     freopen("milk3.in","r",stdin);
19     freopen("milk3.out","w",stdout);
20     scanf("%d%d%d",&A,&B,&C);
21     data.a=data.b=0;data.c=C;//初始状态
22     bfs();
23     sort(ans,ans+point);
24     for (int i=0;i<point;i++) printf("%d ",ans[i]);
25     return 0;
26 }
27 void bfs()
28 {
29      memset(h,0,sizeof(h));//初始化哈希表
30      memset(h_2,0,sizeof(h_2));
31      queue<State>Q;
32      Q.push(data);
33      hash(data)=1;
34      check(data);
35      while (!Q.empty())
36      {
37            State u=Q.front(),v;Q.pop();
38            v=u;
39            //倒满的
40            if (v.a>=B-v.b) {v.a-=B-v.b;v.b=B;if (hash(v)==0) {Q.push(v);hash(v)=1;check(v);}}v=u;
41            if (v.b>=A-v.a) {v.b-=A-v.a;v.a=A;if (hash(v)==0) {Q.push(v);hash(v)=1;check(v);}}v=u;
42            if (v.a>=C-v.c) {v.a-=C-v.c;v.c=C;if (hash(v)==0) {Q.push(v);hash(v)=1;check(v);}}v=u;
43            if (v.c>=A-v.a) {v.c-=A-v.a;v.a=A;if (hash(v)==0) {Q.push(v);hash(v)=1;check(v);}}v=u;
44            if (v.c>=B-v.b) {v.c-=B-v.b;v.b=B;if (hash(v)==0) {Q.push(v);hash(v)=1;check(v);}}v=u;
45            if (v.b>=C-v.c) {v.b-=C-v.c;v.c=C;if (hash(v)==0) {Q.push(v);hash(v)=1;check(v);}}v=u;
46            //倒不满
47            if (v.a<B-v.b) {v.b+=v.a;v.a=0;if (hash(v)==0) {Q.push(v);hash(v)=1;check(v);}}v=u;
48            if (v.b<A-v.a) {v.a+=v.b;v.b=0;if (hash(v)==0) {Q.push(v);hash(v)=1;check(v);}}v=u;
49            if (v.a<C-v.c) {v.c+=v.a;v.a=0;if (hash(v)==0) {Q.push(v);hash(v)=1;check(v);}}v=u;
50            if (v.c<A-v.a) {v.a+=v.c;v.c=0;if (hash(v)==0) {Q.push(v);hash(v)=1;check(v);}}v=u;
51            if (v.c<B-v.b) {v.b+=v.c;v.c=0;if (hash(v)==0) {Q.push(v);hash(v)=1;check(v);}}v=u;
52            if (v.b<C-v.c) {v.c+=v.b;v.b=0;if (hash(v)==0) {Q.push(v);hash(v)=1;check(v);}}v=u;
53      }
54 }
55 void check(State t)
56 {
57      if (t.a==0 && h_2[t.c]==0)
58      {
59          ans[point++]=t.c;
60          h_2[t.c]=1;
61      }
62      return;
63 }

【USACO 1.4.4】母亲的牛奶

时间: 2024-12-21 20:27:31

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

洛谷 P1215 [USACO1.4]母亲的牛奶 Mother&#39;s Milk

题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的.由于节约,牛奶不会有丢失. 写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 输入输出格式 输入格式: 单独的一行包括三个整数A,B和C. 输出格式: 只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性. 输入输出样例 输入样例#1:

luogu P1215 [USACO1.4]母亲的牛奶 Mother&#39;s Milk

题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的.由于节约,牛奶不会有丢失. 写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 输入输出格式 输入格式: 单独的一行包括三个整数A,B和C. 输出格式: 只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性. 输入输出样例 输入样例#1:

母亲的牛奶(milk) (BFS)

问题 A: 母亲的牛奶(milk) 时间限制: 1 Sec  内存限制: 64 MB提交: 14  解决: 8[提交][状态][讨论版] 题目描述 农民约翰有三个容量分别是A.B.C升的桶,A.B.C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一 个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的,由于节约,牛奶不会丢失.写一个程序去帮助约翰找出当A桶是空的时候,C桶中 牛奶所剩量的所有可能性. 输入 单独的1行,包括三个整数A,

【USACO 1.2.1】挤牛奶

[问题描述] 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300时刻(从5点开始计时,秒为单位)给他的牛挤奶,一直到1000时刻.第二个农民在700时刻开始,在 1200时刻结束.第三个农民在1500时刻开始2100时刻结束.期间最长的至少有一个农民在挤奶的连续时间为900秒(从300时刻到1200时刻),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300时刻(从1200时刻到1500时刻). 你的任务是编一个程序,读入一个有N个农民(1 <= N <= 5000

母亲的牛奶(milk)

母亲的牛奶(milk) 题目描述 农民约翰有三个容量分别是A.B.C升的桶,A.B.C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的,由于节约,牛奶不会丢失.写一个程序去帮助约翰找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 输入 单独的1行,包括三个整数A,B和C. 输出 只有1行,列出当A桶是空的时候,C桶牛奶所剩量的所有可能性. 样例输入 8 9 10 样例输出 1 2

[USACO1.4]母亲的牛奶 Mother&#39;s Milk

题目 题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的.由于节约,牛奶不会有丢失. 写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 输入输出格式 输入格式: 单独的一行包括三个整数A,B和C. 输出格式: 只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性. 输入输出样例 输入样例

$P1215 [USACO1.4]母亲的牛奶 Mother&#39;s Milk$

\(problem\) 搜索 找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 显然 我们需要一个数组来判重 表示这种状态出现过没有. 然而 储存答案. 需要一个桶?或者sort咯 不过多个cnt 我咧懒得打. 所以我们用一个\(vis[N][N][N] ;\) 来判重 表示这种状态出现过没有 出现过就直接返回. 然后用一个ans数组来储存答案\(ans[N] ;\) 都是布尔型的就行. 然后进入程序片段. 一共三个字母 则倒法有 \(3!=1*2*3=6\). 那就手工模拟好了.不用循环了

【USACO 1.3.1】混合牛奶

[题目描述] 由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要.帮助梅丽乳业找到最优的牛奶采购方案. 梅丽乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是不同的.此外,就像每头奶牛每天只能挤出固定数量的奶,每位奶农每天能提供的牛奶数量是一定的.每天梅丽乳业可以从奶农手中采购到小于或者等于奶农最大产量的整数数量的牛奶. 给出梅丽乳业每天对牛奶的需求量,还有每位奶农提供的牛奶单价和产量.计算采购足够数量的牛奶所需的最小花费. 注:每天所有奶农的总产量大于梅丽乳业

UPC-1526 母亲的牛奶【搜索】

题目描述 农民约翰有三个容量分别是A.B.C升的桶,A.B.C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的,由于节约,牛奶不会丢失.写一个程序去帮助约翰找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 输入 单独的1行,包括三个整数A,B和C. 输出 只有1行,列出当A桶是空的时候,C桶牛奶所剩量的所有可能性. 样例输入 8 9 10 样例输出 1 2 8 9 10 可能的倒