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
/*
ID:qhn9992
PROG:milk3
LANG:C++11
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <set>
using namespace std;
int A,B,C;
bool full[21];
typedef pair< int,pair<int,int> > pIII;
queue<pIII> q;
set<pIII> st;
pIII get3p(int a,int b,int c)
{
return make_pair(a,make_pair(b,c));
}
int main()
{
freopen("milk3.in","r",stdin);
freopen("milk3.out","w",stdout);
scanf("%d%d%d",&A,&B,&C);
full[C]=true;
q.push( get3p(0,0,C) );
st.insert( get3p(0,0,C) );
while(!q.empty())
{
pIII u,v;
int temp;
u=q.front(); q.pop();
///six way empty or full
if(u.first)
{
///A---->B
v=u;
temp=min(v.first,B-v.second.first);
v=get3p(v.first-temp,v.second.first+temp,v.second.second);
if(!st.count(v))
{
st.insert(v);
q.push(v);
if(v.first==0) full[v.second.second]=true;
}
///A---->C
v=u;
temp=min(v.first,C-v.second.second);
v=get3p(v.first-temp,v.second.first,v.second.second+temp);
if(!st.count(v))
{
st.insert(v);
q.push(v);
if(v.first==0) full[v.second.second]=true;
}
}
if(u.second.first)
{
///B---A
v=u;
temp=min(v.second.first,A-v.first);
v=get3p(v.first+temp,v.second.first-temp,v.second.second);
if(!st.count(v))
{
st.insert(v);
q.push(v);
if(v.first==0) full[v.second.second]=true;
}
///B---->C
v=u;
temp=min(v.second.first,C-v.second.second);
v=get3p(v.first,v.second.first-temp,v.second.second+temp);
if(!st.count(v))
{
st.insert(v);
q.push(v);
if(v.first==0) full[v.second.second]=true;
}
}
if(u.second.second)
{
///C---->A
v=u;
temp=min(v.second.second,A-v.first);
v=get3p(v.first+temp,v.second.first,v.second.second-temp);
if(!st.count(v))
{
st.insert(v);
q.push(v);
if(v.first==0) full[v.second.second]=true;
}
///C----->B
v=u;
temp=min(v.second.second,B-v.second.first);
v=get3p(v.first,v.second.first+temp,v.second.second-temp);
if(!st.count(v))
{
st.insert(v);
q.push(v);
if(v.first==0) full[v.second.second]=true;
}
}
}
bool first=true;
for(int i=0;i<=20;i++)
{
if(full[i])
{
if(first) first=false;
else putchar(32);
printf("%d",i);
}
}
putchar(10);
return 0;
}