USACO 1.4-Mother's Milk

/*
ID: m1590291
TASK: milk3
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string.h>
#define MAX 25
int A,B,C;
int ans[MAX];       //涂灰的标志数组
int vis[MAX][MAX][MAX];     //dfs的执行数组
/******************************************************************************************************************
               思路:
               1,找出倒牛奶的6种状态,再深搜就OK
               2,6种状态分别是    c->a  ||  c->b;
                                    b->a  ||  b->c;
                                    a->b  ||  a->c;
               3,每种状态对应两种情况,能倒满和倒不满
               4,深搜的实质,将白色图案涂灰的过程   {找到 (return 条件)和(涂灰条件)是关键}
******************************************************************************************************************/
using namespace std;

void dfs(int a,int b,int c)
{
    if(vis[a][b][c])    return ;
    vis[a][b][c]=1;
    if(a == 0 && !ans[c])       //涂灰条件
        ans[c]=1;
    if(c >= A-a) dfs(A,b,c-A+a);        //c->a
    else
        dfs(a+c,b,0);
    if(c >= B-b) dfs(a,B,c-B+b);        //c->b
    else
        dfs(a,b+c,0);
    if(b >= A-a) dfs(A,b-A+a,c);        //b->a
    else
        dfs(a+b,0,c);
    if(b >= C-c) dfs(a,b-C+c,C);        //b->c
    else
        dfs(a,0,c+b);
    if(a >= B-b) dfs(a-B+b,B,c);        //a->b
    else
        dfs(0,b+a,c);
    if(a >= C-c) dfs(a-C+c,b,C);        //a->c
    else
        dfs(0,b,c+a);
}
int main()
{
    ifstream fin("milk3.in");
    ofstream fout("milk3.out");

    while(fin>>A>>B>>C)
    {
        int flag=1;
        memset(vis,0,sizeof(vis));
        memset(ans,0,sizeof(ans));

        dfs(0,0,C);
        for(int i = 0;i <= 20;i ++){
            if(ans[i]){
                if(flag){
                    fout<<i;
                    flag=0;
                }
                else
                    fout<<" "<<i;
            }
        }
        fout<<endl;
    }
    return 0;
}

你可能感兴趣的:(USACO 1.4-Mother's Milk)