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.
A single line with the three integers A, B, and C.
8 9 10
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.
1 2 8 9 10
2 5 10
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; }