USACO 1.4.4 Mother's Milk

题意:

  给定A,B,C三个杯子的容积(0-20的整数),初始状态为C满牛奶,每一次互相倒必须有一个灌满或者一个为空,

      求出所有当A为空的时候,C当前牛奶的状态的数值,从小到大输出

解法:

      搜索,深度优先和宽度优先都可以。需要一个数组来记录状态的访问情况,

      下面采用dfs来进行求解,states数组标记访问状态,ans数组记录结果

      

/*
ID: lsswxr1
PROG: milk3
LANG: C++
*/
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <iomanip>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
using namespace std;

#define USACO
#ifdef USACO
#define cin fin
#define cout fout
#endif
//////////////////////////////////////////////////////////////////////////
///宏定义
const int  INF = 1000000000;
const int MAXN = 21;
const int maxn = MAXN;
///全局变量 和 函数
int states[maxn][maxn][maxn];
bool ans[maxn];
int A, B, C;
void dfs(int curA, int curB, int curC)
{
    if (curA > A || curB > B || curC > C)
    {
        return;
    }
    if (states[curA][curB][curC])
    {
        return;
    }
    states[curA][curB][curC] = true;
    if (curA == 0)
    {
        ans[curC] = true;
    }
    

    //测试从A倒
    if (curA > 0)
    {
        if (curA + curB <= B)   // A -> B
        {
            dfs(0, curB + curA, curC);
        }
        else
        {
            dfs(curA - (B - curB), B, curC);
        }

        if (curA + curC <= C)    // A -> C
        {
            dfs(0, curB, curC + curA);
        }
        else
        {
            dfs(curA - (C - curC), curB, C);
        }
    }
    //测试从B倒
    if (curB > 0)
    {
        if (curA + curB <= A)   // B -> A
        {
            dfs(curA + curB, 0, curC);
        }
        else
        {
            dfs(A, curB - (A - curA), curC);
        }
        if (curC + curB <= C)   // B -> C
        {
            dfs(curA, 0, curB + curC);
        }
        else
        {
            dfs(curA, curB - (C - curC), C);
        }
    }
    //测试从C倒
    if (curC > 0)
    {
        if (curC + curA <= A)   // C -> A
        {
            dfs(curA + curC, curB, 0);
        }
        else
        {
            dfs(A, curB, curC - (A - curA));
        }
        if (curC + curB <= B)   // C -> B
        {
            dfs(curA, curB + curC, 0);
        }
        else
        {
            dfs(curA, B, curC - (B - curB));
        }
    }
}
int main()
{
#ifndef USACO
    freopen("D:\\input.txt", "r", stdin);
#endif

#ifdef USACO    
    ofstream fout ("milk3.out");
    ifstream fin ("milk3.in");
#endif   
    
    while (cin >> A >> B >> C)
    {
        memset(states, 0, sizeof(states));
        memset(ans, 0, sizeof(ans));
        dfs(0, 0, C);

        int cnt = 0;
        for (int i = 0; i < maxn; i++)
        {
            if (ans[i])
            {
                if (cnt == 0)
                {
                    cout << i;
                    cnt++;
                }
                else
                {
                    cout << " " << i;
                }
            }
        }
        cout << endl;
    }


    ///结束
    return 0;
}

 

posted on 2013-12-25 10:12  小书包_Ray  阅读(285)  评论(0编辑  收藏  举报

导航