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;
}