Mother's Mil 母亲的牛奶

Description

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

Input

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

Output

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

Sample Input

8 9 10

Sample Output

1 2 8 9 10


刚开始以为这道题是对所有情况进行分类,发现有几个情况是很难直接找出来的,是一个循环的过程。
后来听大佬说这个题用DFS做,当时有些蒙,,,咋用DFS

静下心来想一想,发现是有规律的,A桶只能到给B桶和C桶,B桶C桶同理。也就是说,用递归把所有可能的组合方式都跑一遍,找出其中满足条件的C桶的容量。(感觉会T,会爆栈的呀)

对于固定的方式,可用DFS搜索全部状态。

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<string>
  5 #include<cmath>
  6 #include<algorithm>
  7 #include<queue>
  8 #include<stack>
  9 #include<deque>
 10 #include<map>
 11 #include<iostream>
 12 using namespace std;
 13 typedef long long  LL;
 14 const double pi=acos(-1.0);
 15 const double e=exp(1);
 16 const int N = 200009;
 17 
 18 int x,y,z,cnt=1;
 19 int check[22][22][22],ans[100000];
 20 
 21 bool cmp(int a,int b)
 22 {
 23     return a<b;
 24 }
 25 void DFS(int a,int b,int c)
 26 {
 27     if(a!=0&&b!=0&&c!=z)
 28         check[a][b][c]=1;
 29     if(a==0&&check[a][b][c]!=2)
 30     {
 31         check[a][b][c]=2;
 32         ans[cnt++]=c;
 33     }
 34 
 35     if(a)
 36     {
 37         if(b!=y)
 38         {
 39             if(a>=(y-b))
 40                 if(check[a-(y-b)][y][c]==0)
 41                     DFS(a-(y-b),y,c);
 42             if(a<(y-b))
 43                 if(check[0][b+a][c]==0)
 44                     DFS(0,b+a,c);
 45         }
 46         if(c!=z)
 47         {
 48             if(a>=(z-c))
 49                 if(check[a-(z-c)][b][z]==0)
 50                     DFS(a-(z-c),b,z);
 51             if(a<(z-c))
 52                 if(check[0][b][c+a]==0)
 53                     DFS(0,b,c+a);
 54         }
 55     }
 56     if(b)
 57     {
 58         if(a!=x)
 59         {
 60             if(b>=(x-a))
 61                 if(check[x][b-(x-a)][c]==0)
 62                     DFS(x,b-(x-a),c);
 63             if(b<(x-a))
 64                 if(check[a+b][0][c]==0)
 65                     DFS(a+b,0,c);
 66         }
 67         if(c!=z)
 68         {
 69             if(b>=(z-c))
 70                 if(check[a][b-(z-c)][z])
 71                     DFS(a,b-(z-c),z);
 72             if(b<(z-c))
 73                 if(check[a][0][c+b])
 74                     DFS(a,0,c+b);
 75         }
 76     }
 77     if(c)
 78     {
 79         if(a!=x)
 80         {
 81             if(c>=(x-a))
 82                 if(check[x][b][c-(x-a)]==0)
 83                     DFS(x,b,c-(x-a));
 84             if(c<(x-a))
 85                 if(check[a+c][b][0]==0)
 86                     DFS(a+c,b,0);
 87         }
 88         if(b!=y)
 89         {
 90             if(c>=(y-b))
 91                 if(check[a][y][c-(y-b)]==0)
 92                     DFS(a,y,c-(y-b));
 93             if(c<(y-b))
 94                 if(check[a][b+c][0]==0)
 95                     DFS(a,b+c,0);
 96         }
 97     }
 98 }
 99 
100 int main()
101 {
102     int i,p,j,n;
103     scanf("%d%d%d",&x,&y,&z);
104     check[0][0][z]=2;
105     ans[0]=z;
106     DFS(0,0,z);
107     sort(ans,ans+cnt,cmp);
108     printf("%d",ans[0]);
109     for(i=1;i<cnt;i++)
110         printf(" %d",ans[i]);
111     putchar('\n');
112     return 0;
113 }
View Code
 

猜你喜欢

转载自www.cnblogs.com/daybreaking/p/9721172.html