农民约翰有三个容量分别是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
三个桶:每个桶都有两种状态,a>b,a>c,b>a,b>c,c>a,c>b;
#include<queue> #include<cstdlib> #include<algorithm> #include<map> #include<cstring> #include<cmath> using namespace std; int vis[25][25][25]={0}; int A,B,C; int ans[1000000]= {0}; int t=0; void dfs(int a,int b,int c) { if(vis[a][b][c]==1) return ; else vis[a][b][c]=1; if(a==0) ans[t++]=c; if(A-a>=c) dfs(a+c,b,0); else dfs(A,b,c-A+a); if(B-b>=c) dfs(a,b+c,0); else dfs(a,B,c-B+b); if(B-b>=a) dfs(0,b+a,c); else dfs(a-B+b,B,c); if(C-c>=a) dfs(0,b,c+a); else dfs(a-C+c,b,C); if(A-a>=b) dfs(a+b,0,c); else dfs(A,b-A+a,c); if(C-c>=b) dfs(a,0,c+b); else dfs(a,b-C+c,C); } int main() { int i; scanf("%d%d%d",&A,&B,&C); dfs(0,0,C); sort(ans,ans+t); for(i=0; i<=t-1; i++) { if(i==0) { if(t==1) printf("%d ",ans[0]); else printf("%d ",ans[0]); continue; } if(i!=t-1) { if(ans[i]!=ans[i-1]) printf("%d ",ans[i]); } else { if(ans[i]!=ans[i-1]) printf("%d ",ans[i]); } } }