/*
ID: lucien23
PROG: milk3
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<set>
#include<string>
using namespace std;
typedef struct
{
int a;
int b;
int c;
}BucketVals;
struct comp
{
bool operator()(const BucketVals &bucketVal1,const BucketVals &bucketVal2) const
{
string str1="",str2="";
str1+=bucketVal1.a+'0';
str1+=bucketVal1.b+'0';
str1+=bucketVal1.c+'0';
str2+=bucketVal2.a+'0';
str2+=bucketVal2.b+'0';
str2+=bucketVal2.c+'0';
return str1<str2;
}
};
void pour(BucketVals nowVal,BucketVals totalVal,bool isFirst);
set<int> cVals;
set<BucketVals,comp> bucketVals;
int main()
{
ifstream infile("milk3.in");
ofstream outfile("milk3.out");
if(!infile || !outfile)
{
cout<<"file operation failure!"<<endl;
return -1;
}
int A,B,C;
infile>>A>>B>>C;
BucketVals nowVal,totalVal;
totalVal.a=A;
totalVal.b=B;
totalVal.c=C;
nowVal.a=0;
nowVal.b=0;
nowVal.c=C;
pour(nowVal,totalVal,true);
set<int>::iterator it=cVals.begin();
while(it!=cVals.end())
{
outfile<<*it;
it++;
if(it!=cVals.end())
outfile<<" ";
}
outfile<<endl;
return 0;
}
void pour(BucketVals nowVal,BucketVals totalVal,bool isFirst)
{
if(!isFirst && nowVal.a==0 && nowVal.b==0 && nowVal.c==totalVal.c || bucketVals.find(nowVal)!=bucketVals.end())
return;
bucketVals.insert(nowVal);
if(nowVal.a==0)
cVals.insert(nowVal.c);
int exVal;
BucketVals newVals;
if(nowVal.a>0)//A桶中有牛奶
{
//A-->B
exVal=min(nowVal.a,totalVal.b-nowVal.b);
newVals.a=nowVal.a-exVal;
newVals.b=nowVal.b+exVal;
newVals.c=nowVal.c;
pour(newVals,totalVal,false);
//A-->C
exVal=min(nowVal.a,totalVal.c-nowVal.c);
newVals.a=nowVal.a-exVal;
newVals.c=nowVal.c+exVal;
newVals.b=nowVal.b;
pour(newVals,totalVal,false);
}
if(nowVal.b>0)//B桶中有牛奶
{
//B-->A
exVal=min(nowVal.b,totalVal.a-nowVal.a);
newVals.a=nowVal.a+exVal;
newVals.b=nowVal.b-exVal;
newVals.c=nowVal.c;
pour(newVals,totalVal,false);
//B-->C
exVal=min(nowVal.b,totalVal.c-nowVal.c);
newVals.b=nowVal.b-exVal;
newVals.c=nowVal.c+exVal;
newVals.a=nowVal.a;
pour(newVals,totalVal,false);
}
if(nowVal.c>0)//C桶中有牛奶
{
//C-->A
exVal=min(nowVal.c,totalVal.a-nowVal.a);
newVals.a=nowVal.a+exVal;
newVals.c=nowVal.c-exVal;
newVals.b=nowVal.b;
pour(newVals,totalVal,false);
//C-->B
exVal=min(nowVal.c,totalVal.b-nowVal.b);
newVals.b=nowVal.b+exVal;
newVals.c=nowVal.c-exVal;
newVals.a=nowVal.a;
pour(newVals,totalVal,false);
}
}
USACO Section 1.4 Mother's Milk
最新推荐文章于 2021-08-06 19:31:49 发布