[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的由小 ...
随机推荐
- Linux学习教程
前言 “Linux?听说是一个操作系统,好用吗?” “我也不知道呀,和windows有什么区别?我能在Linux上玩LOL吗” “别提了,我用过Linux,就是黑乎乎一个屏幕,鼠标也不能用,不停地的敲 ...
- 2015 多校赛 第三场 1002 (hdu 5317)
Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more and more i ...
- fontSpider字蛛,好用的字体压缩工具教程
一直觉得很多字体特别好看,但是那些好看的字体只能做在图片上不能用CSS样式去实现,作为一个会设计的前端,真心觉得很烦恼,有时候那些文字需要更换,修改起来非常麻烦,要到处去找源文件,找不到源文件还要尽力 ...
- Android 权限管理(持续整理)
1. Android 6.0之后,APP可以直接安装,运行时再询问用户授予相关权限,此时系统弹出一个对话框,(这个对话框不能由开发者定制) 同时用户也可以在手机的“设置”中对于某个App进行权限管理 ...
- JS排序之选择排序
遍历这个数组,先确定索引为0的数字为暂时最小数, 在剩下的数据中,以第一个为标杆,和剩下的数依次进行比较,如果标杆大于某数,则进行索引交换,继续比较,则a[i]=min; 最后让a[i]与索引为0的数 ...
- 三维重建:SLAM的粒度和工程化问题
百度百科的定义.此文引用了其他博客的一些图像,如有侵权,邮件联系删除. 申明一下,SLAM不是一个算法,而是一个工程. 在计算机视觉中, 三维重建是指根据单视图或者多视图的图像重建三维信息的过程. 由 ...
- 时序分析:串匹配—Brute-Force算法
在使用KMP算法之前,使用了BF算法用于串匹配:原文链接已无法查找..... 设有主串s和子串t,子串t的定位就是要在主串s中找到一个与子串t相等的子串.通常把主串s称为目标串,把子串t ...
- Apex语言(三)原始数据类型
1.原始数据类型(Primitive) 整数:Integer 双精度:Double 单精度:Decimal 长整型:Long 日期:Date 日期时间:Datetime 字符串:String ID:I ...
- eas之f7
f7控件实际上是一张单据.所以对于数据的修改实际上是需要修改单据的,是在eas中修改单据的元数据是组件.包括了f7控件, F7是个快捷键,是某个字段符合条件的集合! F7就是一个控件,用来 ...
- Vue主要原理最简实现与逻辑梳理
Vue的主要原理中主要用到了定义的这么几个函数Dep,Watcher,observer.我们来使用这几个函数简单的实现一下vue构造函数数据绑定和相互依赖部分,梳理一下它们之间的关系.省略了编译部分和 ...