usaco Mother's Milk

题意:给你三个杯子,体积分别为v1, v2, v3。其中第三个杯子是装满牛奶的。问:输出所有v1的杯子为空时,v3可能的体积。每次倒牛奶,结束时只能是倒入的杯子满了,或者是倒的杯子空了。

这一题采用了暴力搜索

/**
TASK: milk3
ID: DickensTone
LANG: C++
**/
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 20 + 2;
int ans[maxn];
bool vis[maxn][maxn][maxn];
bool have[maxn];
int v1, v2, v3, cnt = 0;
void pour(int p1, int p2, int p3)
{
    if(vis[p1][p2][p3]) return;
    vis[p1][p2][p3] = 1;
    if(p1 == 0 && !have[p3]) {ans[cnt++] = p3; have[p3] = 1;}
    if(p1 < v1)
    {
        int t = v1 - p1;
        int temp = min(t, p2);
        pour(p1 + temp, p2 - temp, p3);
        temp = min(t, p3);
        pour(p1 + temp, p2, p3 - temp);
    }
    if(p2 < v2)
    {
        int t = v2 - p2;
        int temp = min(t, p1);
        pour(p1 - temp, p2 + temp, p3);
        temp = min(t, p3);
        pour(p1, p2 + temp, p3 - temp);
    }
    if(p3 < v3)
    {
        int t  = v3 - p3;
        int temp = min(t, p1);
        pour(p1 - temp, p2, p3 + temp);
        temp = min(t, p2);
        pour(p1, p2 - temp, p3 + temp);
    }
}
int main()
{
    freopen("milk3.in", "r", stdin);
    freopen("milk3.out", "w", stdout);
    while(scanf("%d%d%d", &v1, &v2, &v3) == 3)
    {
        memset(have, 0, sizeof(have));
        memset(vis, 0, sizeof(vis));
        memset(ans, 0, sizeof(ans));
        cnt = 0;
        pour(0, 0, v3);
        sort(ans, ans + cnt);
        for(int i = 0; i < cnt - 1; i++)
            printf("%d ", ans[i]);
        printf("%d\n", ans[cnt - 1]);
    }
    return 0;
}


你可能感兴趣的:(usaco)