codevs1226倒水问题(Bfs)
2016-04-23 10:42
274 查看
/* 首先建立模型 可以看成是三个水杯 第三个无穷大 (这里看成是201足够了) 最少步数 想到Bfs 维护队列里的状态:要有个步数 还要有v :此时刻三个杯子有多少水 然后倒水:因为没有刻度 所以有两种情况:要么出水的为空 要么接水的满了 然后每次取队首时判断有没有某一个杯子装的水恰好为答案 注意判重时可以弄一个f [a][b] 表示第一个杯子有a升水 第二个杯子有b升水的状态存在了没 */ #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int x,y,z,f[101][101],c[4]; struct node { int v[4];//此状态每个杯子的水有多少 int step;//步数 }; queue<node>q; int main() { cin>>x>>y>>z; c[1]=x;c[2]=y;c[3]=201;//记号最大容量 node be; be.step=0; be.v[1]=0;be.v[2]=0; be.v[3]=201; q.push(be);//出状态 前两个杯子空 第三个大杯子满 while(!q.empty()) { node tmp=q.front(); q.pop(); if(tmp.v[1]==z||tmp.v[2]==z)//判断符合条件了没有 { cout<<tmp.step; return 0; } int i,j; for(i=1;i<=3;i++)// 枚举出水的杯子和接水的 for(j=1;j<=3;j++) if(!tmp.v[i]||tmp.v[j]==c[j])continue;//如果出水的空了 或者接水的满了 跳过 else { int minn=min(tmp.v[i]+tmp.v[j],c[j])-tmp.v[j];//计算到多少水 node x=tmp; x.v[i]-=minn;//倒水 x.v[j]+=minn;//节水 x.step=tmp.step+1; if(f[x.v[1]][x.v[2]]==0)//判断此状态存在了没 { f[x.v[1]][x.v[2]]=1; q.push(x); } } } cout<<"impossible"; return 0; }
相关文章推荐
- 石头、剪子、布游戏系统
- Netmap分析(四)
- java常量池技术
- Java千百问_05面向对象(010)_java中重载和覆盖有什么关系
- 机器学习-周志华
- Mysql介绍
- Masonry适配——(1)使用注意事项
- XMPP协议解析
- 一款新颖实用的安防产品--丁盯智能门磁
- sql server存储过程 以及几个常用案例
- PostgreSQL之序列使用
- async & await (转载)
- 最长公共子序列(LCS问题)的DP解法
- 为什么用BufferedWriter将int型写入文件后是乱码-Java/Eclipse
- BestCoder Round #81 (div.2)
- SCCM 2012远程控制
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- 盘点淘宝、腾讯、百度内部使用的JavaScript库
- 第五篇:R语言数据可视化之散点图
- Git 配置和仓库获取