【问题描述】

有两个无刻度标志的水壶,分别可装x升和y升 ( x,y 为整数且均不大于100)的水。设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒。已知x升壶为空壶, y升壶为空壶。问如何通过倒水或灌水操作, 用最少步数能在x或y升的壶中量出 z(z ≤ 100)升的水来。

【样例输入】

3 22 1

【样例输出】

14

【解题思路】

看到求最少步数,马上想到用广度优先搜索,那么问题在于如何展开?要不要剪枝?其实,这道题是不需要任何剪枝的,只要判重就行了,那么关键就在于如何展开。

对于x壶和y壶,设它们壶中各装了a,b升水,那么一共有以下六种操作:

若a>0且b<y,那么可以用x向y中倾倒min(a,y-b)升水,此时,x中剩余a-min(a,y-b)升水,y中剩余b+min(a,y-b)升水,同理,当a<x,b>0时可以反操作。

若a>0时,可将x向水缸中倒出a升水,此时x中没有水,y中不变,若b>0时也可反操作。

若a<x时,可从水缸中倒出x-a升水至x中,此时x中有x升水,y中不变,b<y时也可反操作。

根据这六种操作,我们如何拓展的问题就解决了。

【代码实现】

 uses math;
type rec=record
dep,x,y:longint;
end;
var a:array[..] of rec;
f:array[..,..] of boolean;
h,r,x,y,z,xx,yy:longint;
begin
readln(x,y,z);
fillchar(f,sizeof(f),true);
f[,]:=false;
h:=;r:=;
while h<>r do
begin
inc(h);
if (a[h].x>=)and(a[h].y<=y) then
begin
inc(r);
a[r]:=a[h];
a[r].dep:=a[h].dep+;a[r].x:=a[h].x-min(a[h].x,y-a[h].y);a[r].y:=a[h].y+min(a[h].x,y-a[h].y);
if not(f[a[r].x,a[r].y]) then
dec(r)
else
f[a[r].x,a[r].y]:=false;
end;
if (a[r].x=z)or(a[r].y=z) then
begin
writeln(a[r].dep);
exit;
end;
if (a[h].x<=x)and(a[h].y>=) then
begin
inc(r);
a[r]:=a[h];
a[r].dep:=a[h].dep+;a[r].x:=a[h].x+min(a[h].y,x-a[h].x);a[r].y:=a[h].y-min(a[h].y,x-a[h].x);
if not(f[a[r].x,a[r].y]) then
dec(r)
else
f[a[r].x,a[r].y]:=false;
end;
if (a[r].x=z)or(a[r].y=z) then
begin
writeln(a[r].dep);
exit;
end;
if a[h].x>= then
begin
inc(r);
a[r]:=a[h];
a[r].dep:=a[h].dep+;a[r].x:=;
if not(f[a[r].x,a[r].y]) then
dec(r)
else
f[a[r].x,a[r].y]:=false;
end;
if (a[r].x=z)or(a[r].y=z) then
begin
writeln(a[r].dep);
exit;
end;
if a[h].x<=x then
begin
inc(r);
a[r]:=a[h];
a[r].dep:=a[h].dep+;a[r].x:=x;
if not(f[a[r].x,a[r].y]) then
dec(r)
else
f[a[r].x,a[r].y]:=false;
end;
if (a[r].x=z)or(a[r].y=z) then
begin
writeln(a[r].dep);
exit;
end;
if a[h].y>= then
begin
inc(r);
a[r]:=a[h];
a[r].dep:=a[h].dep+;a[r].y:=;
if not(f[a[r].x,a[r].y]) then
dec(r)
else
f[a[r].x,a[r].y]:=false;
end;
if (a[r].x=z)or(a[r].y=z) then
begin
writeln(a[r].dep);
exit;
end;
if a[h].y<=y then
begin
inc(r);
a[r]:=a[h];
a[r].dep:=a[h].dep+;a[r].y:=y;
if not(f[a[r].x,a[r].y]) then
dec(r)
else
f[a[r].x,a[r].y]:=false;
end;
if (a[r].x=z)or(a[r].y=z) then
begin
writeln(a[r].dep);
exit;
end;
end;//六种展开方式,每次展开后都要判重,然后看是否达到目标
writeln('impossible');
end.

倒水问题 (codevs 1226) 题解的更多相关文章

  1. 洛谷P1432 倒水问题(CODEVS.1226)

    To 洛谷.1432 倒水问题 题目背景 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were co ...

  2. codevs 1226 倒水问题

    1226 倒水问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold   题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x, ...

  3. CodeVS 1226 倒水问题【DFS/BFS】

    题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水 ...

  4. 计算系数 (codevs 1137) 题解

    [问题描述] 给定一个多项式(ax + by)^k,给定a.b.k.n.m,请求出多项式展开后x^n y^m项的系数. [样例输入] 1 1 3 1 2 [样例输出] 3 [解题思路] 本题为NOIP ...

  5. lightoj 1226 - One Unit Machine(dp+大组合数去摸)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1226 题解:由于这些任务完成是有先后的所以最后一个完成的肯定是最后一个任务的子 ...

  6. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

  7. HDU 5881 Tea -2016 ICPC 青岛赛区网络赛

    题目链接 题意:有一壶水, 体积在 L和 R之间, 有两个杯子, 你要把水倒到两个杯子里面, 使得杯子水体积几乎相同(体积的差值小于等于1), 并且使得壶里剩下水体积不大于1. 你无法测量壶里剩下水的 ...

  8. hdu_5881_Tea(xjb猜)

    题目链接:hdu_5881_Tea 题意: 有一壶水, 体积在 L 和 R 之间, 有两个杯子, 你要把水倒到两个杯子里面, 使得杯子水体积几乎相同(体积的差值小于等于1), 并且使得壶里剩下水体积不 ...

  9. code1052 地鼠游戏

    贪心算法,从后往前 来自codevs的题解: 我的纠结思考过程:如果每一秒都没有重复的地鼠出现 那么肯定是一个一个挨着打如果有重复的地鼠 那么要考虑打那个更优 当然是选分值最大的 单纯这样想很合理 但 ...

随机推荐

  1. Log4j等级测试

    一.结论: 1./**debug.info.warn.error.fatal由低到高*/ 2.注意:log.error(message,e)不会打印异常堆栈信息. 二.测试过程 1.代码 packag ...

  2. Windows消息初探(1)

    Windows消息初探(1) 最近恢复对Windows API的学习,深深感受到没有对应的中文资料的痛苦,于是上MSDN上面去将Windows消息搞了一些回来翻译出来,供自己查阅,也与大家分享,能力有 ...

  3. jsp页面

    //获取根目录 ${pageContext.request.contextPath} //(父页面提交,嵌入页面显示)提交表单,设置响应方法和返回结果页面显示在frame中 <input typ ...

  4. 使用ImageNet在faster-rcnn上训练自己的分类网络

    具体代码见https://github.com/zhiyishou/py-faster-rcnn 这是我对cup, glasses训练的识别 faster-rcnn在fast-rcnn的基础上加了rp ...

  5. TCP和HTTP的关系

    TCP和HTTP的关系 首先简单地看看tcp,TCP连接是通过4个值来识别的: <源IP地址 源端口号 目的IP地址 目的端口号> 这四个值定义了一个TCP连接,两条不同的TCP连接中这四 ...

  6. Eclipse插件开发之基础篇(4) OSGi框架

    转载出处:http://www.cnblogs.com/liuzhuo. 1. 什么是OSGi框架 OSGi(Open Service Gateway Initiative)框架是运行在JavaVM环 ...

  7. No.010 Regular Expression Matching

    10. Regular Expression Matching Total Accepted: 89193 Total Submissions: 395441 Difficulty: Hard Imp ...

  8. Retrofit入门

    1 Retrofit retrofit = new Retrofit.Builder() .addConverterFactory(ScalarsConverterFactory.create()) ...

  9. 【Hibernate 5】继承映射配置及多态查询

    一.继承实现的三种策略 1.1,单表继承.每棵类继承树使用一个表(table per class hierarchy) -->本文主要介绍的继承策略 类继承树对应多个类,要把多个类的信息存放在一 ...

  10. windows svn

    1.1Svn和VisualSvn介绍 VisualSvn Server2.5.6(版本控制服务器)免费开源软件 是基于Windows平台上的Subversion服务器,它是免费的 官方下载: http ...