母亲的牛奶(milk)

母亲的牛奶(milk)

题目描述

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

输入

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

输出

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

样例输入

8 9 10

样例输出

1 2 8 9 10

分析:考虑所有情况即可,暴力转移;
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include <ext/rope>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define vi vector<int>
#define pii pair<int,int>
#define mod 1000000007
#define inf 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
const int maxn=1e3+10;
const int dis[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
using namespace std;
using namespace __gnu_cxx;
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
int n,m,k;
set<int>ans;
struct node
{
    int x,y,z;
    bool operator<(const node&r)const
    {
        if(x==r.x&&y==r.y)return z<r.z;
        else if(x==r.x)return y<r.y;
        else return x<r.x;
    }
 
};
map<node,int>p;
void dfs(node u)
{
    if(p[u]==1)return;
    p[u]=1;
    if(u.x==0)ans.insert(u.z);
    if(u.x<n)
    {
        if(u.y)
        {
            node v=u;
            v.x+=min(n-u.x,u.y);
            v.y-=min(n-u.x,u.y);
            dfs(v);
        }
        if(u.z)
        {
            node v=u;
            v.x+=min(n-u.x,u.z);
            v.z-=min(n-u.x,u.z);
            dfs(v);
        }
    }
    if(u.y<m)
    {
        if(u.x)
        {
            node v=u;
            v.y+=min(m-u.y,u.x);
            v.x-=min(m-u.y,u.x);
            dfs(v);
        }
        if(u.z)
        {
            node v=u;
            v.y+=min(m-u.y,u.z);
            v.z-=min(m-u.y,u.z);
            dfs(v);
        }
    }
    if(u.z<k)
    {
        if(u.x)
        {
            node v=u;
            v.z+=min(k-u.z,u.x);
            v.x-=min(k-u.z,u.x);
            dfs(v);
        }
        if(u.y)
        {
            node v=u;
            v.z+=min(k-u.z,u.y);
            v.y-=min(k-u.z,u.y);
            dfs(v);
        }
    }
}
int main()
{
    int i,j,t;
    scanf("%d%d%d",&n,&m,&k);
    node q;
    q.x=0,q.y=0,q.z=k;
    dfs(q);
    printf("%d",*ans.begin());
    for(set<int>::iterator it=ans.begin();it!=ans.end();it++)
    {
        if(it==ans.begin())continue;
        else printf(" %d",*it);
    }
    printf("\n");
    //system ("pause");
    return 0;
}

 

 
posted @ 2016-07-30 09:22  mxzf0213  阅读(278)  评论(0编辑  收藏  举报