usaco milk3

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值