【问题描述】

有两个无刻度标志的水壶,分别可装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. hive处理hbase数据

    CREATE EXTERNAL TABLE table1( key string, zoneid int, result int, ) STORED BY 'org.apache.hadoop.hiv ...

  2. 在内核中增加对yaffs文件系统的支持

    自己最近在搞一些内核以及根文件系统的移植,就涉及到了需要在内核中增加对yaffs文件系统的支持.在网上找了一些文档后,自己将具体的操作过程做了一个总结,方便以后查询使用: 1.获取yaffs源码 YA ...

  3. GlusterFS特性介绍

    下面是GlusterFS的一些特性 规范的接口 GlusterFS服务器与POSIX兼容,使用支持文件扩展属性的磁盘文件系统(如ext4.XFS)来存储磁盘上的数据.同时,可以通过业界标准的访问协议如 ...

  4. 一步步教你为网站开发Android客户端---HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新ListView

    本文面向Android初级开发者,有一定的Java和Android知识即可. 文章覆盖知识点:HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新List ...

  5. 使用PetaPoco ORM 框架分页查询

    通过在派生的Repository中调用GetPagingEntities方法来获取分页数据,并返回由PagingDataSet<T>封装分页集合,例如: Public PagingData ...

  6. Android四大组件小结

    Android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个 ...

  7. phonegap ios默认启动页

    phonegap创建的项目默认的启动界面是phonegap的图标,想去掉这个图标,有两个方法,第一就是将resourece下面的splash文件下面的图片改成自己想要的启动页面,名字要相同,替换掉它默 ...

  8. javascript代码复用(四)-混入、借用方法和绑定

    这篇继续说js的现代复用模式:混入.借用方法和绑定. 混入 可以针对前面提到的通过属性复制实现代码复用的想法进行一个扩展,就是混入(mix-in).混入并不是复制一个完整的对象,而是从多个对象中复制出 ...

  9. Retina CS强大漏洞检测工具

    RetinaCS强大漏洞检测工具 Eeye数字安全公司成立于上世纪九十年代末期,它是世界领先的安全公司,它采用最新研究成果和创新技术来保证您的网络兄系统安全,并向您提供最强大的如下服务:全面的.漏洞评 ...

  10. SVN与TortoiseSVN实战:补丁详解

    硬广:<SVN与TortoiseSVN实战>系列已经写了五篇,第二篇<SVN与TortoiseSVN实战:标签与分支>和第三篇<SVN与TortoiseSVN实战:Tor ...