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; }
相关文章推荐
- 计数排序
- 递归
- 如何将视差数据保存为 txt 数据文件以便在 Matlab 中读取分析?
- c++11 中auto 相当方便
- 电脑硬盘分区为何从C盘开始?A和B盘呢?
- 数据结构 树(二叉树 链式存储)
- 对象数组操作长方柱类
- C27_OC17-日期类型NSDate
- .net 错误处理
- hash poj_1200 Crazy Search
- 20140511 科技脉搏 -中国互联网正在全面接管中国经济?
- eclipse安装Flash Builder 4后变成中文,怎么解决
- Leetcode 树 Same Tree
- linux下的基本命令
- 命令行执行python模块时提示包找不到的问题
- C26_OC16-OC类型包装
- 小总结
- 不容易系列之(4)——考新郎 杭电 acm 2049 Java
- iftop和iostat安装和简单使用
- 0012-APK-Activity-Wallpaper