QAQ
思路:纯纯的暴力搜索,枚举6种情况。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int a,b,c;
int cnt;
int ans[999];
int f[99][99][99];//状态数组,记录情况有无搜过
void dfs(int ra,int rb,int rc)//分别是三个桶的牛奶数目
{
if(f[ra][rb][rc]) return;//如果搜到这个情况了,返回吧
if(ra==0) ans[++cnt]=rc;//如果a桶空了,记录答案。
f[ra][rb][rc]=1;//标记这种情况搜过了
int xa=a-ra;
int xb=b-rb;
int xc=c-rc;//分别是三个桶可以倒入牛奶的量
if(ra>0&&rb<b)//a桶有奶且b桶可以倒入
{
if(ra<=xb) dfs(0,rb+ra,rc);//如果a桶的奶量小于等于b桶可以倒入的量,那就全倒入b中
else dfs(ra-xb,b,rc);//如果a桶的奶量大于b桶可以倒入的量,那就把b倒满,计算a桶倒完剩下的奶量
}
if(ra>0&&rc<c)
{
if(ra<=xc) dfs(0,rb,rc+ra);
else dfs(ra-xc,rb,c);
}
if(rb>0&&ra<a)
{
if(rb<=xa) dfs(ra+rb,0,rc);
else dfs(a,rb-xa,rc);
}
if(rb>0&&rc<c)
{
if(rb<=xc) dfs(ra,0,rc+rb);
else dfs(ra,rb-xc,c);
}
if(rc>0&&ra<a)
{
if(rc<=xa) dfs(ra+rc,rb,0);
else dfs(a,rb,rc-xa);
}
if(rc>0&&rb<b)
{
if(rc<=xb) dfs(ra,rb+rc,0);
else dfs(ra,b,rc-xb);
}
}
int main()
{
scanf("%d%d%d",&a,&b,&c);
dfs(0,0,c);//开始只有c桶有奶且c桶满了啊23333
sort(ans+1,ans+cnt+1);//升序输出
for(int i=1;i<=cnt;i++)
printf("%d ",ans[i]);
return 0;
}