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

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

题目描述

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

写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。

输入输出格式

输入格式:

 

单独的一行包括三个整数A,B和C。

 

输出格式:

 

只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。

 

输入输出样例

输入样例#1:
[输入1]
8 9 10
[输入2]
2 5 10 
输出样例#1:
[输出1]
1 2 8 9 10 
[输出2]
5 6 7 8 9 10

说明

题目翻译来自NOCOW。

USACO Training Section 1.4

爆搜六种情况,判重时只判断a和c就行.

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 //bool v[25][25][25];
 6 bool v[110][110];
 7 bool vc[110];
 8 int A,B,C,cnt;
 9 
10 void dfs(int a,int b,int c)
11 {
12     if (v[a][c]) return ;
13     v[a][c] = true;
14     if (a==0&&!vc[c]) vc[c] = true;;
15     if (c>0)
16     {
17         if (a<A) dfs(min(A,a+c),b,max(0,c-(A-a)));    //c to a
18         if (b<B) dfs(a,min(B,b+c),max(0,c-(B-b)));    //c to b
19     }
20     if (a>0) 
21     {
22         if (b<B) dfs(max(0,a-(B-b)),min(B,b+a),c);    //a to b
23         if (c<C) dfs(max(0,a-(C-c)),b,min(C,c+a));    //a to c
24     }
25     if (b>0)
26     {
27         if (a<A) dfs(min(A,a+b),max(0,b-(A-a)),c);    //b to a    
28         if (c<C) dfs(a,max(0,b-(C-c)),min(C,c+b));    //b to c
29     }
30 }
31 int main()
32 {
33     scanf("%d%d%d",&A,&B,&C);
34     dfs(0,0,C);
35     for (int i=C-B; i<=C; ++i)
36         if (vc[i]) printf("%d ",i);
37     return 0; 
38 }

 

posted @ 2017-06-22 10:16  MJT12044  阅读(339)  评论(0编辑  收藏  举报