1226 倒水问题

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 点此展开

这题,,,确实做的我懵逼。。。

首先是题目太恶心。。。有八种情况。。。刚开始我只考虑到4种。。。。

然后,记录步数的时候,step莫名其妙/2就是正确答案。。。

AC的一脸懵逼。。。。。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<cstdlib>
 5 using namespace std;
 6 const int MAXN=1001;
 7 int vis[MAXN][MAXN];
 8 int x,y,z;
 9 int step=0;
10 int p1,p2;
11 void bfs()
12 {
13     queue<int>qx;queue<int>qy;
14     qx.push(x);qy.push(y);
15     while(qx.size()!=0&&qy.size()!=0)
16     {
17         int wx=qx.front();int wy=qy.front();
18         if(wx==z||wy==z)
19         {printf("%d",step/2);exit(0);}
20         qx.pop();
21         qy.pop();
22         if(wx<0||wy<0||wx>x||wy>y||vis[wx][wy]==1)continue;
23         vis[wx][wy]=1;
24         step++;
25         qx.push(x);qy.push(wy);// x灌满
26         qx.push(0);qy.push(wy);// 把x倒空
27         qx.push(wx);qy.push(y);// y灌满
28         qx.push(wx);qy.push(0);// 把y倒空
29         qx.push(0);qy.push(wy+wx);// x - > y no shenyu
30          qx.push(wx-y+wy);qy.push(y);// you shengyu
31         qx.push(wx+wy);qy.push(0);// y - > x noshengyu
32         qx.push(x);qy.push(wy-x+wx); // youshengyu...
33     }
34 }
35 int main()
36 {
37     scanf("%d%d%d",&x,&y,&z);
38     bfs();
39     printf("impossible");
40     return 0;
41 }
时间: 2024-12-23 19:17:45

1226 倒水问题的相关文章

[Wikioi 1226]倒水问题

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

广度优先搜索 cdoevs 1226 倒水问题

cdoevs 1226 倒水问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知 x 升壶为空 壶, y 升壶为空壶.问如何通过倒水或灌水操作, 用最少步数能在x或y升的壶中量出 z ( z ≤ 100 )升的水 来. 输入描述 Input D

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

To 洛谷.1432 倒水问题 题目背景 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted with the following puzzle. They were given a 3-gallon jug and a 5-gallon jug and were asked to fill the 5-gallon jug with exactly 4 gallons. This

倒水问题 (codevs 1226) 题解

[问题描述] 有两个无刻度标志的水壶,分别可装x升和y升 ( x,y 为整数且均不大于100)的水.设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知x升壶为空壶, y升壶为空壶.问如何通过倒水或灌水操作, 用最少步数能在x或y升的壶中量出 z(z ≤ 100)升的水来. [样例输入] 3 22 1 [样例输出] 14 [解题思路] 看到求最少步数,马上想到用广度优先搜索,那么问题在于如何展开?要不要剪枝?其实,这道题是不需要任何剪枝的,只要判重就行了,那么关

hdu 1226 BFS + bfs记录路径

http://acm.hdu.edu.cn/showproblem.php?pid=1226 为了省空间,可以用vis数组初始化的时候初始化为-1, 发现一个BFS容易错的地方 开始一直WA在这里:就是我int tp=q.front();之后马上q.pop():了,然后才去判断是不是符合条件以break,这样就不能根据q.empty()==1认为没有找到ans 因为这里WA了 其实也可以vis[0] == -1来判断 比较不理解的是 当n==0的时候 %n==0的时候怎么处理 //#pragma

倒水问题

[题目描述] 有两个无刻度标志的水壶,分别可装x升和y升(x,y为整数且均不大于100)的水.设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水,两水壶间,水也可以相互倾倒.已知x升壶为空壶,y升壶为空壶.问如何通过倒水或灌水操作,用最少步数能在x或y升的壶中量出z(z ≤ 100)升的水来. [输入描述] 一行,三个数据,分别表示x,y和z. [输出描述] 一行,输出最小步数,如果无法达到目标,则输出“impossible”. [样例输入] 3 22 1 [样例输出] 14

Pots BFS(著名倒水问题升级版)

Pots You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: FILL(i)        fill the pot i (1 ≤ i ≤ 2) from the tap; DROP(i)      empty the pot i to the drain; POUR(i,j)    pour from pot i 

2017广东工业大学程序设计竞赛 E倒水(Water)

原题链接:http://www.gdutcode.sinaapp.com/problem.php?cid=1057&pid=4 Problem E: 倒水(Water) Description 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会

hdu - 1226 超级密码 (bfs)

http://acm.hdu.edu.cn/showproblem.php?pid=1226 难以想到怎么去bfs,还是对状态的划分不明确,知道了之后感觉还是挺简单的. 这题关键是密码可能很长,然后判断是否整除用到了一点技巧,确保不会溢出,输出的时候是用递归回溯输出. 因为同一个数可以取多次,而最终取的是数值最小的,故输入之后从小到大排序,然后从第一个数到最后一个数每次添加一遍,直到找到合适的为止. 为了便于输出用了数组模拟队列. 1 #include <cstdio> 2 #include