USACO-Section 1.4 Mother's Milk(BFS)

28 篇文章 0 订阅

Mother's Milk

Farmer John has three milking buckets of capacity A, B, and C liters. Each of the numbers A, B, and C is an integer from 1 through 20, inclusive. Initially, buckets A and B are empty while bucket C is full of milk. Sometimes, FJ pours milk from one bucket to another until the second bucket is filled or the first bucket is empty. Once begun, a pour must be completed, of course. Being thrifty, no milk may be tossed out.

Write a program to help FJ determine what amounts of milk he can leave in bucket C when he begins with three buckets as above, pours milk among the buckets for a while, and then notes that bucket A is empty.

PROGRAM NAME: milk3

INPUT FORMAT

A single line with the three integers A, B, and C.

SAMPLE INPUT (file milk3.in)

8 9 10

OUTPUT FORMAT

A single line with a sorted list of all the possible amounts of milk that can be in bucket C when bucket A is empty.

SAMPLE OUTPUT (file milk3.out)

1 2 8 9 10

SAMPLE INPUT (file milk3.in)

2 5 10

SAMPLE OUTPUT (file milk3.out)

5 6 7 8 9 10

今天USACO总挂,好烦人。。。

很简单的搜索题,深搜、宽搜都可以,感觉宽搜更容易写就用的宽搜,每次将未出现的状态压入队列中,出队列时判断是否合法,直至队列为空


/*
ID: your_id_here
PROG: milk3
LANG: C++
*/
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>

using namespace std;

struct Status {
    int a,b,c;
}u,v;

int a,b,c,t;
bool vis[21][21][21],used[21],flag;
queue<Status> q;

void pour(int& sta,int& des,int full) {//将sta中的牛奶倒入des中,sta为空或者des满时不影响
    t=full-des;
    if(sta<t)
        des+=sta,sta=0;
    else
        sta-=t,des+=t;
    if(!vis[v.a][v.b][v.c]) {//判断这个状态是否出现过
        q.push(v);
        vis[v.a][v.b][v.c]=true;
    }
    v=u;
}

void BFS() {
    while(!q.empty())
        q.pop();
    u.a=u.b=0,u.c=c;
    q.push(u);
    vis[u.a][u.b][u.c]=true;
    while(!q.empty()) {
        v=u=q.front();
        q.pop();
        if(u.a==0)//是否符合题意
            used[u.c]=true;
        pour(v.a,v.b,b);
        pour(v.b,v.a,a);
        pour(v.b,v.c,c);
        pour(v.c,v.a,a);
        pour(v.c,v.b,b);
    }
}

int main() {
    int i;
    freopen("milk3.in","r",stdin);
    freopen("milk3.out","w",stdout);
    while(3==scanf("%d%d%d",&a,&b,&c)) {
        memset(vis,false,sizeof(vis));
        memset(used,false,sizeof(used));
        BFS();
        flag=false;
        for(i=0;i<=20;++i)
            if(used[i]) {
                if(flag)
                    printf(" ");
                printf("%d",i);
                flag=true;
            }
        printf("\n");
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值