dfs (状态划分)

农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的。有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。 写一个程序去帮助约翰找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。

Input

单独的一行包括三个整数A,B和C。

Output

只有一行,列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。

Sample Input

8 9 10

Sample Output

1 2 8 9 10



三个桶:每个桶都有两种状态,a>b,a>c,b>a,b>c,c>a,c>b;

#include<queue>
#include<cstdlib>
#include<algorithm>
#include<map>
#include<cstring>
#include<cmath>
using namespace std;
int vis[25][25][25]={0};
int A,B,C;
int ans[1000000]= {0};
int t=0;
void dfs(int a,int b,int c)
{
    if(vis[a][b][c]==1)
        return ;
    else
        vis[a][b][c]=1;
    if(a==0)
        ans[t++]=c;
    if(A-a>=c)
        dfs(a+c,b,0);
    else
        dfs(A,b,c-A+a);
    if(B-b>=c)
        dfs(a,b+c,0);
    else
        dfs(a,B,c-B+b);
    if(B-b>=a)
        dfs(0,b+a,c);
    else
        dfs(a-B+b,B,c);
    if(C-c>=a)
        dfs(0,b,c+a);
    else
        dfs(a-C+c,b,C);
    if(A-a>=b)
        dfs(a+b,0,c);
    else
        dfs(A,b-A+a,c);
    if(C-c>=b)
        dfs(a,0,c+b);
    else
        dfs(a,b-C+c,C);
}
int main()
{
    int i;
    scanf("%d%d%d",&A,&B,&C);
    dfs(0,0,C);
    sort(ans,ans+t);
    for(i=0; i<=t-1; i++)
    {
        if(i==0)
        {
            if(t==1)
                printf("%d\n",ans[0]);
            else
                printf("%d ",ans[0]);
            continue;
        }
        if(i!=t-1)
        {
            if(ans[i]!=ans[i-1])
                printf("%d ",ans[i]);
        }
        else
        {
            if(ans[i]!=ans[i-1])
                printf("%d\n",ans[i]);
        }
    }
}

 

posted @ 2018-09-19 18:27  我的秘密小屋  阅读(353)  评论(0编辑  收藏  举报