题目描述
农民约翰有三个容量分别是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
参考代码
#include<stdio.h>
int s[30][30][30]={0},aa,bb,c;
int ans[30]={0};
void check(int ac,int bc,int cc)
{
if(s[ac][bc][cc])return ;
s[ac][bc][cc]=1;
if(ac>bb-bc) //Aåå
¥B
check(ac+bc-bb,bb,cc); else
check(0,bc+ac,cc);
if(ac>c-cc) //Aåå
¥C
check(ac-c+cc,bc,c); else
check(0,bc,cc+ac);
if(bc>c-cc) //Båå
¥C
check(ac,bc-c+cc,c); else
check(ac,0,cc+bc);
if(bc>aa-ac) //Båå
¥A
check(aa,bc-aa+ac,cc); else
check(ac+bc,0,cc);
if(cc>aa-ac) //Cåå
¥A
check(aa,bc,cc-aa+ac); else
check(ac+cc,bc,0);
if(cc>bb-bc) //Cåå
¥B
check(ac,bb,cc-bb+bc); else
check(ac,bc+cc,0);
return ;
}
int main()
{
int i,j,flag;
scanf("%d %d %d",&aa,&bb,&c);
check(0,0,c);
flag=1;
for (i=0;i<=bb;i++)
{
for (j=0;j<=c;j++)
{
if(s[0][i][j])ans[j]=1;
}
}
for (i=0;i<30;i++)
{
if(ans[i]&&flag)
{
printf("%d",i);
flag=0;
} else if(ans[i])printf(" %d",i);
}
printf("n");
return 0;
}
解析
暂无