[Wikioi 1226]倒水问题
题目描写叙述 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
操作2:装满b桶
操作3:清空a桶
操作4:清空b桶
操作5:将B桶中的水倒入A桶
操作6:将A桶的水倒入B桶
- #include <stdio.h>
- #define MAXN 200
- #define INF 10000000
- 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 i,j,ans=INF;
- scanf("%d%d%d",&a,&b,&z);
- dfs(0,0,0);
- for(i=0;i<=a;i++)
- if(f[i][z]!=0)
- if(f[i][z]<ans)
- ans=f[i][z]; //遍历全部B桶中达到水量z的情况。获得最优解
- for(i=0;i<=b;i++)
- if(f[z][i]!=0)
- if(f[z][i]<ans)
- ans=f[z][i]; //遍历全部B桶中达到水量z的情况,获得最优解
- if(ans==INF) printf("impossible\n");
- else printf("%d\n",ans-1);
- return 0;
- }
- #include <stdio.h>
- #include <stdlib.h>
- #include <queue>
- #define MAXN 110
- using namespace std;
- int a,b,z,f[MAXN][MAXN]; //目标是取z L水
- struct cup
- {
- int x; //x桶(大桶)中的水量
- int y; //y桶(小桶)中的水量
- int sol; //sol=量出的水量
- int step; //step=倒水次数
- }first,now;
- queue<cup>Q;
- void extend(cup in) //扩展结点
- {
- if(f[in.x][in.y]!=0) return;
- f[in.x][in.y]++;
- in.step++;
- cup p=in;
- //操作1:装满a桶
- p.x=a;
- Q.push(p);
- //操作2:装满b桶
- p=in;
- p.y=b;
- Q.push(p);
- //操作3:清空a桶
- p=in;
- p.x=0;
- Q.push(p);
- //操作4:清空b桶
- p=in;
- p.y=0;
- Q.push(p);
- //操作5:将B桶中的水倒入A桶
- p=in;
- if(in.x+in.y<=a) //(i)B桶倒空后A桶不会溢出
- {
- p.x=in.x+in.y;
- p.y=0;
- Q.push(p);
- }
- else //(ii)B桶倒空后A桶会溢出,故B桶中有残留
- {
- p.x=a;
- p.y=in.x+in.y-a;
- Q.push(p);
- }
- //操作6:将A桶的水倒入B桶
- p=in;
- if(in.x+in.y<=b) //(i)A桶倒空后B桶不会溢出
- {
- p.y=in.x+in.y;
- p.x=0;
- Q.push(p);
- }
- else //(ii)A桶倒空后B桶会溢出,故A桶中有残留
- {
- p.y=b;
- p.x=in.x+in.y-b;
- Q.push(p);
- }
- }
- void bfs()
- {
- Q.push(first);
- while(!Q.empty())
- {
- now=Q.front();
- Q.pop(); //取出队首状态
- if(now.x==z||now.y==z)
- {
- printf("%d\n",now.step);
- exit(0);
- }
- extend(now);
- }
- printf("impossible\n");
- }
- int main()
- {
- scanf("%d%d%d",&a,&b,&z);
- first.step=0;
- first.x=0;
- first.y=0;
- bfs();
- return 0;
- }
[Wikioi 1226]倒水问题的更多相关文章
- 广度优先搜索 cdoevs 1226 倒水问题
cdoevs 1226 倒水问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升 ...
- codevs 1226 倒水问题
1226 倒水问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x, ...
- CodeVS 1226 倒水问题【DFS/BFS】
题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水 ...
- 洛谷P1432 倒水问题(CODEVS.1226)
To 洛谷.1432 倒水问题 题目背景 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were co ...
- 倒水问题 (codevs 1226) 题解
[问题描述] 有两个无刻度标志的水壶,分别可装x升和y升 ( x,y 为整数且均不大于100)的水.设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知x升壶为空壶, ...
- BZOJ 1226: [SDOI2009]学校食堂Dining
1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 730 Solved: 446[Submit][ ...
- POJ 1226 后缀数组
题目链接:http://poj.org/problem?id=1226 题意:给定n个字符串[只含大小写字母],求一个字符串要求在n个串或者他们翻转后的串的出现过.输出满足要求的字符串的长度 思路:根 ...
- 【wikioi】1041 Car的旅行路线
题目链接 算法:最短路(数据弱,Floyd也能过) 惨痛的教训:此题我至少提交了20次,原因在于= =太草率和粗心了,看到那个多少组数据以为是城市的数量,导致数组开得小小的= =.(对不起,wikio ...
- 【wikioi】1040 统计单词个数
题目链接 算法:划分型DP PS:被卡过3天.日期:2013-10-10 ~ 2013-10-12 18:52:48 这题是我提交了13次AC= =汗= = 题目描述: 给出一个长度不超过200的由小 ...
随机推荐
- Django day05 视图层之 (HttpRequest) \ (HttpResponse) \ (JsonResponse) 对象
一:视图层之HttpRequest对象 # 前台Post传过来的数据,包装到POST字典中 # request.POST # 前台浏览器窗口里携带的数据,包装到GET字典中 # request.GET ...
- [转]利用 NPOI 變更字體尺寸及樣式
本文转自:http://blog.cscworm.net/?p=1650 利用 NPOI 變更字體尺寸及樣式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...
- JavaScript 元素的插入顺序以及动态加载js
*****************记录下今天的心得***************** 1.元素的插入顺序 需求:异步从后台读取两个数据a和b,并动态加载到父容器x中,要求a必须在b的左边 实际情况:一 ...
- CSS制作简单loading动画
曾经以为,loading的制作需要一些比较高深的web动画技术,后来发现大多数loading都可以用“障眼法”做出来.比如一个旋转的圆圈,并不都是将gif图放进去,有些就是画个静止图像,然后让它旋转就 ...
- Beta冲刺-星期四
这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 Three cobblers 这个作业的目标 完成今天的冲刺 一 ...
- VMware中linux安装jdk
首先安装linux系统 如何将jdk安装包复制到linux中不做概述,可以使用xftp工具,或者Xshell,或者其他方式. 1.下载jdk包:本章使用的为后缀为tar.gz的文件(不需要安装),如j ...
- Eigen与Matlab语法及语义辞典
Eigen为Matlab转换为C++提供了一个简单的语法级别的代码迁移工具. 对一些代码进行了扩充,以便程序由Matlab到Eigen的移植................... 参考链接:http: ...
- VC维与DNN的Boundary
原文链接:解读机器学习基础概念:VC维来去 作者:vincentyao 目录: 说说历史 Hoeffding不等式 Connection to Learning 学习可行的两个核心条件 Effecti ...
- 读书笔记「Python编程:从入门到实践」_5.if语句
5.1 一个简单示例 cars = ['audi', 'bmw', 'subaru', 'toyota'] for car in cars: if car == 'bmw': print(car.up ...
- mqtt-client回调方法简介
mqtt-client回调方法简介 毫无疑问Callback方式是最复杂的一种,但是其也是能够提供更好的服务,因此有必要好好研究,下面就是对使用回调方式的简单介绍: 一.在使用回调方式前,先通过MQT ...