农民有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。
写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
INPUT FORMAT:
(file milk3.in)
单独的一行包括三个整数A,B和C。
OUTPUT FORMAT:
(file milk3.out)
只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
input:
8 9 10
output:
1 2 8 9 10
【参考程序】:
/*
ID: XIONGNA1
PROG: milk3
LANG: C++
*/
#include<iostream>
#include<cstring>
using namespace std;
bool hash[21][21][21];
int size[4],x,y;
void into(int k)
{
if (x+y>=size[k])//装满
{
x-=size[k]-y; y=size[k];
}
else//倒尽
{
y+=x; x=0;
}
}
void dfs(int a,int b,int c)
{
if (hash[a][b][c]) return ;
hash[a][b][c]=true;
//a-->b
x=a;y=b;
into(2);dfs(x,y,c);
//a-->c
x=a;y=c;
into(3);dfs(x,b,y);
//b-->a
x=b;y=a;
into(1);dfs(y,x,c);
//b-->c
x=b;y=c;
into(3);dfs(a,x,y);
//c-->a
x=c;y=a;
into(1);dfs(y,b,x);
//c-->b
x=c;y=b;
into(2);dfs(a,y,x);
}
void print_path()
{
bool bk=true;
for (int i=0;i<=size[3];i++)
for (int j=0;j<=size[2];j++)
if (hash[0][j][i])
{
if (bk) {printf("%d",i);bk=false;}
else printf(" %d",i);
}
printf("\n");
}
int main()
{
freopen("milk3.in","r",stdin);
freopen("milk3.out","w",stdout);
scanf("%d%d%d",&size[1],&size[2],&size[3]);
memset(hash,false,sizeof(hash));
dfs(0,0,size[3]);
print_path();
return 0;
}