您的位置:首页 > 其它

usaco milk3

2014-05-11 17:04 169 查看
/*
ID: ljracm1
LANG: C++
PROB: milk3
*/
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#define T

using namespace std;

int vis[1000005],ex[25];
int A,B,C;
struct Set{
int a;
int b;
int c;
};

int has(int aa,int bb,int cc){
return aa*10000+bb*100+cc;
}

void bfs(){
Set s;
s.a=0; s.b=0; s.c=C;
queue<Set>q;
q.push(s);
if(s.a==0){
ex[s.c]++;
vis[has(s.a,s.b,s.c)]=1;
}
while(!q.empty()){
Set t = q.front();
q.pop();
if(t.a!=0){
Set x;
if(t.a<=B-t.b){
x.a=0; x.b=t.b+t.a; x.c=t.c;
if(!vis[has(x.a,x.b,x.c)]){
vis[has(x.a,x.b,x.c)]=1;
q.push(x);
ex[x.c]++;
}
}
else{
x.a=t.a+t.b-B; x.b=B; x.c=t.c;
if(!vis[has(x.a,x.b,x.c)]){
q.push(x);
vis[has(x.a,x.b,x.c)]=1;
}
}
if(t.a<=C-t.c){
x.a=0; x.c=t.c+t.a;  x.b=t.b;
if(!vis[has(x.a,x.b,x.c)]){
q.push(x);
ex[x.c]++;
vis[has(x.a,x.b,x.c)]=1;
}
}
else{
x.a=t.a+t.c-C; x.c=C;  x.b=t.b;
if(!vis[has(x.a,x.b,x.c)]){
q.push(x);
vis[has(x.a,x.b,x.c)]=1;
}
}
}
if(t.b!=0){
Set x;
if(t.b<=A-t.a){
x.b=0; x.a=t.b+t.a; x.c=t.c;
if(!vis[has(x.a,x.b,x.c)]){
vis[has(x.a,x.b,x.c)]=1;
q.push(x);
if(x.a==0)ex[x.c]++;
}
}
else{
x.b=t.a+t.b-A; x.a=A;  x.c=t.c;
if(!vis[has(x.a,x.b,x.c)]){
q.push(x);
vis[has(x.a,x.b,x.c)]=1;
if(x.a==0)ex[x.c]++;
}
}
if(t.b<=C-t.c){
x.b=0; x.c=t.c+t.b;  x.a=t.a;
if(!vis[has(x.a,x.b,x.c)]){
q.push(x);
if(x.a==0)ex[x.c]++;
vis[has(x.a,x.b,x.c)]=1;
}
}
else{
x.b=t.b+t.c-C; x.c=C; x.a=t.a;
if(!vis[has(x.a,x.b,x.c)]){
q.push(x);
if(x.a==0)ex[x.c]++;
vis[has(x.a,x.b,x.c)]=1;
}
}
}
if(t.c!=0){
Set x;
if(t.c<=A-t.a){
x.c=0; x.a=t.a+t.c; x.b=t.b;
if(!vis[has(x.a,x.b,x.c)]){
vis[has(x.a,x.b,x.c)]=1;
q.push(x);
if(x.a==0)ex[x.c]++;
}
}
else{
x.a=A; x.c=t.a+t.c-A; x.b=t.b;
if(!vis[has(x.a,x.b,x.c)]){
q.push(x);
vis[has(x.a,x.b,x.c)]=1;
if(x.a==0)ex[x.c]++;
}
}
if(t.c<=B-t.b){
x.c=0; x.b=t.b+t.c; x.a=t.a;
if(!vis[has(x.a,x.b,x.c)]){
q.push(x);
if(x.a==0)ex[x.c]++;
vis[has(x.a,x.b,x.c)]=1;
}
}
else{
x.c=t.b+t.c-B; x.b=B; x.a=t.a;
if(!vis[has(x.a,x.b,x.c)]){
q.push(x);
vis[has(x.a,x.b,x.c)]=1;
if(x.a==0)ex[x.c]++;
}
}
}
}
}

int main(){
#ifdef T
freopen("milk3.in","r",stdin);
freopen("milk3.out","w",stdout);
#endif
cin>>A>>B>>C;
memset(ex,0,sizeof(ex));
memset(vis,0,sizeof(vis));
bfs();
int i=0;
for(i;i<=20; i++){
if(ex[i]==1){
cout<<i;
break;
}
}
for(i=i+1; i<=20; i++){
if(ex[i]==1){
cout<<" "<<i;
}
}
cout<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: