【题解】母亲的牛奶

题目描述

        Farmer John有三个容量分别是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 <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>

using namespace std;

int maxa[4]; 
int f[6]={1,1,2,2,3,3},s[6]={2,3,1,3,1,2};
int is[21][21][21],ans[21];
queue<int> q;

void bfs(int a[4])
{
    if(!a[1]) ans[a[3]]=1;
    for(int i=0;i<6;i++)
    {
        int temp[4]={a[0],a[1],a[2],a[3]};
        temp[f[i]]-=min(a[f[i]],maxa[s[i]]-a[s[i]]);
        temp[s[i]]+=min(a[f[i]],maxa[s[i]]-a[s[i]]);
        if(!is[temp[1]][temp[2]][temp[3]]) is[temp[1]][temp[2]][temp[3]]=1,bfs(temp);
    }
}

int main()
{
    int a[4];
    cin>>a[1]>>a[2]>>a[3];
    maxa[1]=a[1],maxa[2]=a[2],maxa[3]=a[3];
    a[1]=a[2]=0;
    bfs(a);
    for(int i=0,op=0;i<=20;i++)
    {
        if(ans[i])
        {
            if(op++) cout<<" ";
            cout<<i;
        }
    }
    
    return 0;
} 
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10625028.html