milk3-section1.4

来源:互联网 发布:程序员试用期转正申请 编辑:程序博客网 时间:2024/06/10 05:12

题目大意

    农民约翰有三个容量分别是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;}
原创粉丝点击