hdu1495
2016-04-11 23:56
246 查看
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> #include<queue> #include<cstdlib> using namespace std; const int maxn = 101; int s,n,m; bool vis[maxn][maxn][maxn]; struct node { int x,y,sum,cnt; //x对应a杯(m) y对应b杯(n) sum对应c杯(s) }; void bfs() { queue b287 <node> que; memset(vis,false,sizeof(vis)); node p,q; p.x = p.y = p.cnt = 0; p.sum = s; que.push(p); vis[p.x][p.y][p.sum] = true; while(!que.empty()) { //puts("1"); p = que.front(); que.pop(); if( (p.y==s/2&&p.x==s/2) || (p.y==s/2&&p.sum==s/2) || (p.x==s/2&&p.sum==s/2) ) { printf("%d\n",p.cnt); return; } if(p.x!=0)//a杯有可乐 { //a倒b if(p.x>n-p.y) // a杯中的可乐 > b杯中的剩余容量 { q.x = p.x - (n-p.y) ; q.y = n; q.sum = p.sum ; q.cnt = p.cnt + 1; } else { q.x = 0; q.y = p.y + p.x ; q.sum = p.sum ; q.cnt = p.cnt + 1; } if(!vis[q.x][q.y][q.sum]) { vis[q.x][q.y][q.sum] = true; que.push(q); } //a倒c if(p.x>s-p.sum) // a杯中的可乐 > c杯中的剩余容量 { q.x = p.x - (s-p.sum); q.y = p.y ; q.sum = s; q.cnt = p.cnt + 1; } else { q.x = 0; q.y = p.y; q.sum = p.sum + p.x; q.cnt = p.cnt + 1; } if(!vis[q.x][q.y][q.sum]) { vis[q.x][q.y][q.sum] = true; que.push(q); } } if(p.y!=0)//b杯有可乐 { //b倒a if(p.y>m-p.x) // b杯中的可乐 > a杯中的剩余容量 { q.x = m; q.y = p.y - (m-p.x); q.sum = p.sum ; q.cnt = p.cnt + 1; } else { q.x = p.x + p.y; q.y = 0 ; q.sum = p.sum ; q.cnt = p.cnt + 1; } if(!vis[q.x][q.y][q.sum]) { vis[q.x][q.y][q.sum] = true; que.push(q); } //b倒c if(p.y>s-p.sum) // b杯中的可乐 > c杯中的剩余容量 { q.x = p.x; q.y = p.y - (s-p.sum) ; q.sum = s; q.cnt = p.cnt + 1; } else { q.x = p.x; q.y = 0; q.sum = p.sum + p.y; q.cnt = p.cnt + 1; } if(!vis[q.x][q.y][q.sum]) { vis[q.x][q.y][q.sum] = true; que.push(q); } } if(p.sum!=0)//c杯有可乐 { //c倒a if(p.sum>m-p.x) // c杯中的可乐 > a杯中的剩余容量 { q.x = m; q.y = p.y ; q.sum = p.sum - (m-p.x) ; q.cnt = p.cnt + 1; } else { q.x = p.x + p.sum; q.y = p.y ; q.sum = 0 ; q.cnt = p.cnt + 1; } if(!vis[q.x][q.y][q.sum]) { vis[q.x][q.y][q.sum] = true; que.push(q); } //c倒b if(p.sum>n-p.y) // c杯中的可乐 > b杯中的剩余容量 { q.x = p.x; q.y = n ; q.sum = p.sum - (n-p.y); q.cnt = p.cnt + 1; } else { q.x = p.x; q.y = p.y + p.sum; q.sum = 0; q.cnt = p.cnt + 1; } if(!vis[q.x][q.y][q.sum]) { vis[q.x][q.y][q.sum] = true; que.push(q); } } } puts("NO"); } int main() { while(cin>>s>>n>>m) { if(s==0&&n==0&&m==0) break; if(s%2) { puts("NO"); continue; } bfs(); } return 0; }
相关文章推荐
- [前端 4] 使用Js实现图片上传预览
- [前端 4] 使用Js实现图片上传预览
- popupwindow的学习
- 单调递增子序列(二)(nyoj214)
- 1003快速排序
- java多态和动态绑定
- 射频中经常是用50欧姆作为阻抗匹配的标准的原因
- 线程运行机制
- WPF
- JS数组方法汇总 array数组元素的添加和删除
- Map、Set、List、Queue、Stack的特点与用法
- 网页四--按钮反应
- Centos搭建git服务器
- zeroclipboard复制反斜杠时不正确的解决办法
- Intellij Idea 使用笔记
- 详细分析HFSS、ADS、CST各自优缺点及应用范围,看看你到底应该学习哪种仿真?
- vertical-align: middle垂直居中
- 【转】彻底理解安卓里的ldpi、mdpi、hdpi、xhdpi、xxhdpi文件夹含义
- 【珍藏】linux 同步IO: sync、fsync与fdatasync
- 建立一个学生类及其相应对象