USACO-Section 1.4 Mother's Milk(BFS)

来源:互联网 发布:长江大学武汉校区知乎 编辑:程序博客网 时间:2024/06/06 05:30

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_herePROG: milk3LANG: 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;}



0 0