1226 倒水问题
2016-06-10 10:37
323 查看
1226 倒水问题
时间限制: 1 s空间限制: 128000 KB
题目等级 : 黄金 Gold
题解
查看运行结果
题目描述 Description
有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水。设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒。已知 x 升壶为空 壶, y 升壶为空壶。问如何通过倒水或灌水操作, 用最少步数能在x或y升的壶中量出 z ( z ≤ 100 )升的水 来。
输入描述 Input Description
一行,三个数据,分别表示 x,y 和 z;
输出描述 Output Description
一行,输出最小步数 ,如果无法达到目标,则输出"impossible"
样例输入 Sample Input
3 22 1
样例输出 Sample Output
14
数据范围及提示 Data Size & Hint
分类标签 Tags 点此展开
广度优先搜索 深度优先搜索 迭代搜索 搜索#include<cstdio> #include<iostream> #define MAXN 200 #define INF 10000000 using namespace std; int f[MAXN][MAXN],a,b,z; //f[x][y]:达到A桶内水量为x,B桶内水量为y的状态所需步骤数 void dfs(int x,int y,int step){ //x:A桶内水量,y:B桶内水量,step:当前步骤数 if(f[x][y]!=0&&step+1>=f[x][y]) return;//当前状态已经有解且现在的解一定比过去的解更差时,退出 f[x][y]=step+1;//更新当前状态所需最少步骤数 dfs(x,0,step+1);//1、清空B桶 dfs(0,y,step+1);//2、清空A桶 dfs(x,b,step+1);//3、装满B桶 dfs(a,y,step+1);//4、装满A桶 //5、将B桶倒入A桶 if(x+y<=a) dfs(x+y,0,step+1);//(i)B桶倒空后A桶不会溢出 else dfs(a,x+y-a,step+1);//(ii)B桶倒空后A桶会溢出,故B桶中有残留 //6、将A桶倒入B桶 if(x+y<=b) dfs(0,x+y,step+1);//(i)A桶倒空后B桶不会溢出 else dfs(x+y-b,b,step+1);//(ii)A桶倒空后B桶会溢出,故A桶中有残留 } int main() { int ans=INF; scanf("%d%d%d",&a,&b,&z); dfs(0,0,0); for(int i=1;i<=a;i++) if(f[i][z]) ans=min(ans,f[i][z]); //遍历所有B桶中达到水量z的情况,获得最优解 for(int i=1;i<=b;i++) if(f[z][i]) ans=min(ans,f[z][i]);//遍历所有B桶中达到水量z的情况,获得最优解 if(ans==INF) printf("impossible\n"); else printf("%d\n",ans-1); return 0; }
相关文章推荐
- json_decode详解
- 第二阶段冲刺第一天
- Android编码规范
- algorithm 题集四 (16.06.10)
- windows 桌面/desktop 及 MessageBox(MB_TOPMOST)
- 传递额外的值 Passing Extra Values |在视图中生成输出URL | 高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼
- Ecshop IIS Rewrite伪静态规则
- Spring Mvc那点事---(11)Spring Mvc之mybatis增删改查
- 学生常见问题(三)
- 彻底解决 ECSHOP缩略图 ECSHOP商品图片 不清晰的方法,最新解决办法
- ecshop商品页显示累计销售量,ecshop显示商品销售总数量的方法
- I00021 有负数项的数列之和
- hdu 1728(搜索)
- 今天在技术上有一点成就感
- 单目ORB_SLAM 实战
- Java如何播放音频文件,4行代码帮你搞定(不,1行)!
- 富文本
- ecshop首页显示折扣的方法,ecshop商品显示折扣的方法
- C++第一次上机实验-2
- ecshop模板首页或列表页显示商品简单描述