NYOJ 21 三个水杯
三个水杯
- 描述
- 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
- 输入
- 第一行一个整数N(0<N<50)表示N组测试数据 接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。 第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
- 输出
- 每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
- 样例输入
- 
2 
 6 3 1
 4 1 1
 9 3 2
 7 1 1
- 样例输出
- 
3 
 -1
 原题出自:http://acm.nyist.net/JudgeOnline/problem.php?pid=21 简单的宽度优先搜索,三个水杯之间的相互倒水如下图6种情况: 对于每一次倒水都会引起三个水杯水量状态的改变,这样就可以得到如下的一个解空间树:  代码一:比较容易想到的 #include<cstring> 
 #include<cstdio>
 #include<queue>
 #include<algorithm>
 #include<cstdlib>
 using namespace std; int v1, v2, v3;
 bool visit[][][]; //状态是否出现 struct state
 {
 int a, b, c;
 int ceng; //最小步数
 }b, e; int BFS()
 {
 queue<state> q;
 while(!q.empty())
 q.pop();
 q.push(b);
 while(!q.empty())
 {
 state cur = q.front();
 q.pop();
 visit[cur.a][cur.b][cur.c] = true; if(cur.a == e.a && cur.b == e.b && cur.c == e.c) //找到
 return cur.ceng; if(cur.a > && cur.b < v2) //v1->v2
 {
 state temp = cur;
 int tt = min(temp.a, v2 - temp.b);
 temp.a -= tt;
 temp.b += tt;
 if(visit[temp.a][temp.b][temp.c] == false)
 {
 visit[temp.a][temp.b][temp.c] = true;
 temp.ceng++;
 q.push(temp);
 }
 } if(cur.a > && cur.c < v3) //v1->v3
 {
 state temp = cur;
 int tt = min(temp.a, v3 - temp.c);
 temp.a -= tt;
 temp.c += tt;
 if(visit[temp.a][temp.b][temp.c] == false)
 {
 visit[temp.a][temp.b][temp.c] = true;
 temp.ceng++;
 q.push(temp);
 }
 } if(cur.b > && cur.a < v1) //v2->v1
 {
 state temp = cur;
 int tt = min(temp.b, v1 - temp.a);
 temp.a += tt;
 temp.b -= tt;
 if(visit[temp.a][temp.b][temp.c] == false)
 {
 visit[temp.a][temp.b][temp.c] = true;
 temp.ceng++;
 q.push(temp);
 }
 } if(cur.b > && cur.c < v3) //v2->v3
 {
 state temp = cur;
 int tt = min(temp.b, v3 - temp.c);
 temp.b -= tt;
 temp.c += tt;
 if(visit[temp.a][temp.b][temp.c] == false)
 {
 visit[temp.a][temp.b][temp.c] = true;
 temp.ceng++;
 q.push(temp);
 }
 } if(cur.c > && cur.a < v1) //v3->v1
 {
 state temp = cur;
 int tt = min(temp.c, v1 - temp.a);
 temp.c -= tt;
 temp.a += tt;
 if(visit[temp.a][temp.b][temp.c] == false)
 {
 visit[temp.a][temp.b][temp.c] = true;
 temp.ceng++;
 q.push(temp);
 }
 } if(cur.c > && cur.b < v2) //v3->v2
 {
 state temp = cur;
 int tt = min(temp.c, v2 - temp.b);
 temp.c -= tt;
 temp.b += tt;
 if(visit[temp.a][temp.b][temp.c] == false)
 {
 visit[temp.a][temp.b][temp.c] = true;
 temp.ceng++;
 q.push(temp);
 }
 }
 }
 return -; //没有终状态
 } int main()
 {
 int n;
 scanf("%d", &n);
 while(n--)
 {
 memset(visit, false, sizeof(visit));
 scanf("%d %d %d", &v1, &v2, &v3);
 b.a = v1, b.b = , b.c = , b.ceng = ;
 scanf("%d %d %d", &e.a, &e.b, &e.c);
 if(v1 < e.a + e.b + e.c)
 {
 printf("-1\n");
 continue;
 }
 else
 printf("%d\n", BFS());
 }
 return ;
 }方法二:Floyd 算法 Floyd 算法介绍:http://www.cnblogs.com/orange1438/p/4054649.html #include <cstdio> 
 #include <memory.h>
 #include <queue> using namespace std; #define EMPTY 0 struct data_type
 {
 int state[];
 int step;
 }; int cupCapacity[], targetState[]; bool visited[][][]; bool AchieveTargetState(data_type current)
 {
 for (int i = ; i < ; i++)
 {
 if (current.state[i] != targetState[i])
 {
 return false;
 }
 }
 return true;
 } void PourWater(int destination, int source, data_type &cup)
 {
 int waterYield = cupCapacity[destination] - cup.state[destination];
 if (cup.state[source] >= waterYield)
 {
 cup.state[destination] += waterYield;
 cup.state[source] -= waterYield;
 }
 else
 {
 cup.state[destination] += cup.state[source];
 cup.state[source] = ;
 }
 } int BFS(void)
 {
 int i, j, k;
 data_type initial;
 queue<data_type> toExpandState; memset(visited, false, sizeof(visited));
 initial.state[] = cupCapacity[];
 initial.state[] = initial.state[] = ;
 initial.step = ;
 toExpandState.push(initial);
 visited[initial.state[]][][] = true; while (!toExpandState.empty())
 {
 data_type node = toExpandState.front();
 toExpandState.pop();
 if (AchieveTargetState(node))
 {
 return node.step;
 }
 for (i = ; i < ; i++)
 {
 for (j = ; j < ; j++)
 {
 k = (i+j)%;
 if (node.state[i] != EMPTY && node.state[k] < cupCapacity[k])
 {
 data_type newNode = node;
 PourWater(k, i, newNode);
 newNode.step = node.step + ;
 if (!visited[newNode.state[]][newNode.state[]][newNode.state[]])
 {
 visited[newNode.state[]][newNode.state[]][newNode.state[]] = true;
 toExpandState.push(newNode);
 }
 }
 }
 }
 }
 return -;
 } int main(void)
 {
 int testNum;
 scanf("%d", &testNum);
 while (testNum -- != )
 {
 scanf("%d%d%d", &cupCapacity[], &cupCapacity[], &cupCapacity[]);
 scanf("%d%d%d", &targetState[], &targetState[], &targetState[]);
 printf("%d\n", BFS());
 }
 return ;
 }
 
NYOJ 21 三个水杯的更多相关文章
- nyoj 21三个水杯(BFS + 栈)
		题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=21 思想: 看了一下搜索就来写了这题(BFS 找出最短路径 所以用此来进行搜索) 这题在 ... 
- NYOJ 21.三个水杯-初始态到目标态的最少次数-经典BFS
		题目传送门:biubiubiu~ 三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子. ... 
- NYOJ #21 三个水杯(bfs)
		描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标 ... 
- nyoj 题目21 三个水杯
		三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ... 
- nyoj三个水杯(bfs)
		三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互 ... 
- nyoj 三个水杯
		三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只 ... 
- 三个水杯   (bfs)
		给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的 ... 
- 三个水杯——java,广度优先搜索
		题目如下: 21-三个水杯 内存限制:64MB 时间限制:1000ms 特判: No通过数:51 提交数:137 难度:4 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个 ... 
- 三个水杯(BFS)
		三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 给出三个水杯.大小不一,而且仅仅有最大的水杯的水是装满的,其余两个为空杯子. 三个水杯之间相互倒水,而且水杯 ... 
随机推荐
- Ubuntu 16.04 LTS更新
			Canonical今天正式发布了新版的Ubuntu系统,针对PC.笔记本.上网本.平板和智能手机各类设备.这次的Ubuntu 16.04代号为Xenial Xerus——这个代号是由Canonical ... 
- 在Sharepoint2010中一种自定义调查列表的不允许再次答复提示的处理方法!
			在Sharepoint中默认创建的调查列表系统只允许答复一次,再次答复将报错误信息,这对最终用户而言是非常不友好的体验,当然你也可以在调查设置中的常规设置中设置允许多次答复,这样就会有错误提示信息,但 ... 
- 【Software Clone】2014-IEEE-Towards a Big Data Curated Benchmark of Inter-Project Code Clones
			Abstract 大数据的克隆检测和搜索算法已经作为嵌入在应用中的一部分. 本文推出一个代码检测基准.包含一些已知的真假克隆代码.其中包括600万条真克隆(包含type-1,type-2,type-3 ... 
- window.location 对象所包含的属性
			window.location 对象所包含的属性 属性 描述 hash 从井号 (#) 开始的 URL(锚) host 主机名和当前 URL 的端口号 hostname 当前 URL 的主机名 hre ... 
- actionbar部分设置:colorPrimary colorPrimaryDark colorAccent 下部阴影
			去除actionbar下阴影: <item name="android:windowContentOverlay">@null</item> 
- [OpenCV] Basic data types - Matrix
			http://docs.opencv.org/2.4.13/ Basis 矩形 "modules/core/src/drawing.cpp" CV_IMPL void cvRect ... 
- Hadoop入门进阶课程1--Hadoop1.X伪分布式安装
			本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan ... 
- 受限玻尔兹曼机(RBM)学习笔记(八)RBM 的评估
			去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算 ... 
- CentOS 7.2 MySQL 5.7 主从配置
			MySQL的安装:CentOS 7.2 yum方式安装MySQL 5.7 两台服务器分别如下: Master:192.168.1.100 Slave:192.168.1.101 Master配置: 编 ... 
- Linux - 获取Shell命令帮助信息
			Manual Page Chapter List 1:所有用户可以操作的指令或可执行文件 2:系统核心调用的函数与工具 3:子调用,常用的函数与函数库 4:设备,硬件文件说明,通常是/dev/的文件 ... 
