题目大意
农民约翰有三个容量分别是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
题解
递归找出所有可能的牛奶分布情况,递归终点为该种情况已经被记录下来过了,递归的每一步即为牛奶的相互倾倒的动作,一共六种可能。然后将所有A中为空的升序输出C中牛奶量。
代码
#include<stdio.h>
int dao(int i,int j,int x)
{
if(i<x-j)
return 0;
else
return i+j-x;
}
int shou(int i,int j,int x)
{
if(i<x-j)
return j+i;
else
return x;
}
int A,B,C,m=0;
int n[8000][3]={0};
int f(int a,int b,int c)
{
int i,flag=0,at,bt,ct;
for(i=0;i<m;i++)
{
if((n[i][0]==a)&&(n[i][1]==b)&&(n[i][2]==c))
{
flag=1;
break;
}
}
if(flag==1)
{
return 0;
}
else
{
n[m][0]=a;
n[m][1]=b;
n[m][2]=c;
m++;
at=a;bt=b;ct=c;
at=dao(a,b,B);
bt=shou(a,b,B);
f(at,bt,ct);
at=a;bt=b;ct=c;
at=dao(a,c,C);
ct=shou(a,c,C);
f(at,bt,ct);
at=a;bt=b;ct=c;
bt=dao(b,a,A);
at=shou(b,a,A);
f(at,bt,ct);
at=a;bt=b;ct=c;
bt=dao(b,c,C);
ct=shou(b,c,C);
f(at,bt,ct);
at=a;bt=b;ct=c;
ct=dao(c,a,A);
at=shou(c,a,A);
f(at,bt,ct);
at=a;bt=b;ct=c;
ct=dao(c,b,B);
bt=shou(c,b,B);
f(at,bt,ct);
}
return 0;
}
int main()
{
int i,j,temp,h[8000];
scanf("%d %d %d",&A,&B,&C);
f(0,0,C);
for(i=0;i<8000;i++)
for(j=0;j<7999-i;j++)
if(n[j][2]>n[j+1][2])
{
temp=n[j][2];
n[j][2]=n[j+1][2];
n[j+1][2]=temp;
temp=n[j][1];
n[j][1]=n[j+1][1];
n[j+1][1]=temp;
temp=n[j][0];
n[j][0]=n[j+1][0];
n[j+1][0]=temp;
}
j=0;
for(i=0;i<8000;i++)
{
if(n[i][0]==0&&(n[i][0]+n[i][1]+n[i][2])!=0)
{
h[j]=n[i][2];
j++;
}
}
for(i=0;i<j-1;i++)
printf("%d ",h[i]);
printf("%d\n",h[i]);
return 0;
}