题目描述
农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的。有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。
写一个程序去帮助约翰找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
输入
单独的一行包括三个整数A,B和C。
输出
只有一行,列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
样例输入
8 9 10
样例输出
1 2 8 9 10
各个测试点1s
#include<bits/stdc++.h>
using namespace std;
int a1,b1,c1;
int ans[1002];
int vis[22][22][22];
int min(int a,int b)
{
if(a<b)
{
return a;
}
else
{
return b;
}
}
void dfs(int a,int b,int c)
{
if(a<0||b<0||c<0||a>a1||b>b1||c>c1||vis[a][b][c]==1)
{
return;
}
int t;
vis[a][b][c]=1;
if(a==0)
ans[c]=1;
t=min(c,a1-a);
dfs(a+t,b,c-t);
t=min(c,b1-b);
dfs(a,b+t,c-t);
t=min(b,a1-a);
dfs(a+t,b-t,c);
t=min(b,c1-c);
dfs(a,b-t,c+t);
t=min(a,b1-b);
dfs(a-t,b+t,c);
t=min(a,c1-c);
dfs(a-t,b,c+t);
return;
}
int main()
{
cin>>a1>>b1>>c1;
dfs(0,0,c1);
for(int i=0;i<=1000;i++)
{
if(ans[i]==1)
cout<<i<<" ";
}
return 0;
}