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(' '); 112 return 0; 113 }