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

cdoevs 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

 1 /*注意是两个瓶子在一起才能表示一种状态,考虑好两个瓶子之间倒水的八种情况://向大壶倒满水
 2         //向小壶倒满水
 3         //大壶的水不要
 4         //小壶的水不要
 5           //大壶向小壶倒满水
 6        //大壶向小壶倒水 ,倒不满
 7         //小壶向大壶倒全部水,大壶没满
 8         //小壶向大壶倒水,大壶满了
 9 */
10 #define N 120
11 #include<iostream>
12 using namespace std;
13 #include<cstdio>
14 bool visit[N][N];
15 #include<queue>
16 int x,y,z;
17 struct node{
18     int big,smal,sum;
19 };
20 int bfs(int &ans)
21 {
22     visit[0][0]=true;
23     queue<node>que;
24     que.push(node{0,0,0});
25     while(!que.empty())
26     {
27         node now=que.front();
28         que.pop();
29         int a=now.big,b=now.smal,dep=now.sum;
30         if(a==z||b==z)
31         {
32             ans=dep;
33             return 0;
34         }
35         if(!visit[x][b])
36         {
37             visit[x][b]=true;
38             que.push(node{x,b,dep+1});
39         }
40         if(!visit[a][y])
41         {
42             visit[a][y]=true;
43             que.push(node{a,y,dep+1});
44         }
45         if(!visit[0][b])
46         {
47             visit[0][b]=true;
48             que.push(node{0,b,dep+1});
49         }
50         if(!visit[a][0])
51         {
52             visit[a][0]=true;
53             que.push(node{a,0,dep+1});
54         }
55         if(a>=(y-b)&&!visit[a-(y-b)][y])
56         {
57             visit[a-(y-b)][y]=true;
58             que.push(node{a-(y-b),y,dep+1});
59         }
60         if(a<y-b&&!visit[0][a+b])
61         {
62             visit[0][a+b]=true;
63             que.push(node{0,a+b,dep+1});
64         }if(b>=(x-a)&&!visit[x][b-(x-a)])
65         {
66             visit[x][b-(x-a)]=true;
67             que.push(node{x,b-(x-a),dep+1});
68         }if(b<(x-a)&&!visit[a+b][0])
69         {
70             visit[a+b][0]=true;
71             que.push(node{a+b,0,dep+1});
72         }
73     }
74 }
75 int main()
76 {
77     int ans=0;
78     scanf("%d%d%d",&x,&y,&z);
79     if(x<y) swap(x,y);
80     bfs(ans);
81     if(ans) printf("%d\n",ans);
82     else printf("impossible\n");
83     return 0;
84 }
时间: 2024-10-26 23:18:05

广度优先搜索 cdoevs 1226 倒水问题的相关文章

[Wikioi 1226]倒水问题

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

南阳理工--21--三个水杯~~广度优先搜索

这一题运用广度优先搜索可以解决,主要是各个状态的转移以及某个状态出现过要标记,避免重复,进入死循环. 下面是AC代码,上面有详细的讲解: # include <iostream> # include <cstring> # include <queue> using namespace std; class data //队列的结点, { public: int water[3]; //三个水杯的状态 int step; //步骤 }; bool visited[100

无向图的深度优先与广度优先搜索代码实现

图采用了邻接表的形式储存. 带不带权都无所谓的 深度优先搜索 Depth First Search 道理和树的先序遍历差不多,把将要访问的点入栈,然后从栈里取点进行访问. 由于这只是类中的一个成员函数,有些被调用的函数的具体代码将会在文章最后补上 ,但是函数功能看注释就好了 1 //深度优先 2 void GraphAdjacencyListWeight::DFSAdvanced(int StartVertex) { 3 int *visited = new int[VertexNumber];

SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,

图算法系列-深度优先搜索与广度优先搜索

2.深度优先搜索 为了访问一个顶点,我们将它标记为已经访问过,然后递归的访问所有与子邻接的并且尚未标记的顶点,这就是深度优先搜索(DFS),DFS常用于解决路径问题. 比如下面的连通图,我们从顶点0开始对图进行探索 下面这个图显示了DFS处理时的递归调用树. DFS可以解决的问题:1)环检测:一个图中有环吗?该图是森林吗?2)简单路径:给定两个顶点,是否存在一条连接他们的路径3)简单连通性:无论何时使用DFS,都可以在线性时间内确定一个图是否连通4)顶点搜索:在给定顶点所在的同一个连通分量中有多

图的遍历(深度优先与广度优先搜索两种方案)

1.图的遍历--深度优先搜索 import java.util.Scanner ; public class Map{ static int n ; static int m ; static int[] book ; static int[][] e ; public static void mapDfs(int cur){ //深度优先搜索思想核心: System.out.print(cur + " ") ; for (int i=1;i<=n;i++) { if (e[cu

矩阵图中的广度优先搜索

经常会有类似的题目,如迷宫问题,在一个矩阵图中给定出发点和目标点,每次只能上下左右移动,求到目标点的最短走法,或者说是一共有多少种走法. 思路其实很简单,深搜.广搜.相对比较而言,广度优先搜索更加实用于求最短的走法(步数) 在矩阵图中的广搜需要注意一下几点. 1.确定每步的走法:不同题的走法可能不同,每次搜索时将走法保存在数组中. 2.确定初始状态 往往注意刚开始得起点(i,j)必须把MAP(i,j)改变为 -1(或者其他的),栈中第一个元素即为初始状态 3.保存状态.这点很重要.需要用数组或者

地牢逃脱(BFS(广度优先搜索))

题目描述 给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上.地牢的出口可能在任意某个可以通行的位置上.牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢. 输入描述: 每个输入包含 1 个测试用例.每个测试用例的第一行包含两个整数 n 和 m(1 <= n, m <= 50),表示