21-三个水杯

内存限制:64MB
时间限制:1000ms
Special Judge: No

accepted:7
submit:18

题目描述:

给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。

输入描述:

第一行一个整数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 分析:
  ①、题目要求的是最少的倒水次数,即就是最短步数问题;
  ②、对上一步产生的结果下一步应该怎样应对,用队列来考虑每一步的结果;
  ③、用BFS的思想模拟,每一次(从6种倒水可能中进行抉择与判断)倒水将会参会什么样的结果 步骤:
  ①、初始化队列的首相,即就是最开始的水的分配情况
  ②、循环6步操作,考虑同样的水在6中不同情况下的分配如何,分别入队列
  ③、依次遍历出所有的情况,如果可以得到结果的话,就输出步骤,否则如果遍历完了都没能得到结果就return -1 核心代码:
  
 int bfs()
{
queue<node> Q;
node q1, q2;
memset(book, , sizeof(book));
q1.temp[] = A[], q1.temp[] = , q1.temp[] = ;
book[q1.temp[]][][] = ;
Q.push(q1);
while(!Q.empty())
{
q1 = Q.front();
if(q1.temp[] == B[] && q1.temp[] == B[]
&& q1.temp[] == B[])
return q1.step;
for(int i = ; i < ; ++ i)
{
for(int j = ; j < ; ++ j)
{
if (i == j) continue; // 自己不向自己倒水
q2 = q1;
int my_change = min(q1.temp[i], A[j] - q1.temp[j]); // 将i杯中的水倒入j杯,A[j] - q1.temp[j],表明j杯最多可以得到的水量
q2.temp[i] = q1.temp[i] - my_change;
q2.temp[j] = q1.temp[j] + my_change;
q2.step = q1.step + ;
if(!book[q2.temp[]][q2.temp[]][q2.temp[]])
{
book[q2.temp[]][q2.temp[]][q2.temp[]];
Q.push(q2);
}
}
}
Q.pop();
}
return -;
}

C/C++代码实现(AC):

 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <map>
#include <queue> using namespace std;
const int MAXN = ;
int A[], B[], book[MAXN][MAXN][MAXN];
struct node
{
int temp[], step;
}; bool match(node q, int a, int b, int c)
{
if(q.temp[] == a && q.temp[] == b && q.temp[] == c) return true;
return false;
} int bfs()
{
node q1, q2;
q1.temp[] = A[], q1.temp[] = , q1.temp[] = , q1.step = ;
queue<node> Q;
Q.push(q1);
memset(book, , sizeof(book));
book[A[]][][] = ;
while(!Q.empty())
{
q1 = Q.front();
if(match(q1, B[], B[], B[])) return q1.step;
for(int i = ; i < ; ++ i) // 倒水的方式有6种
{
for(int j = ; j < ; ++ j)
{
if(i == j) continue;
int my_op = min(q1.temp[i], A[j] - q1.temp[j]); // 将i杯子里面的水倒到j杯子中
q2 = q1;
q2.temp[i] = q1.temp[i] - my_op;
q2.temp[j] = q1.temp[j] + my_op;
q2.step ++;
if(!book[q2.temp[]][q2.temp[]][q2.temp[]])
{
book[q2.temp[]][q2.temp[]][q2.temp[]] = ;
Q.push(q2);
}
}
}
Q.pop();
}
return -;
} int main()
{
int t;
scanf("%d", &t);
while(t --)
{
memset(book, , sizeof(book));
scanf("%d%d%d", &A[], &A[], &A[]);
scanf("%d%d%d", &B[], &B[], &B[]);
printf("%d\n", bfs());
}
return ;
}

nyoj 21-三个水杯(BFS)的更多相关文章

  1. nyoj 21三个水杯(BFS + 栈)

    题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=21 思想: 看了一下搜索就来写了这题(BFS 找出最短路径 所以用此来进行搜索) 这题在 ...

  2. NYOJ 21.三个水杯-初始态到目标态的最少次数-经典BFS

    题目传送门:biubiubiu~ 三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子. ...

  3. NYOJ #21 三个水杯(bfs)

    描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标 ...

  4. NYOJ 21 三个水杯

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...

  5. nyoj三个水杯(bfs)

    三个水杯 时间限制:1000 ms  |           内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互 ...

  6. nyoj 题目21 三个水杯

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...

  7. 三个水杯 (bfs)

    给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的 ...

  8. nyoj 三个水杯

    三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只 ...

  9. 三个水杯(BFS)

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 给出三个水杯.大小不一,而且仅仅有最大的水杯的水是装满的,其余两个为空杯子. 三个水杯之间相互倒水,而且水杯 ...

随机推荐

  1. 富文本编辑器(wangEditor)

    近期在产品的开发工作中遇到要使用富文本编辑器的地方.于是对比了几款编辑器, 最后选择了wangEditor. 优点:轻量.简洁.界面美观.文档齐全.   缺点: 相较于百度ueditor等编辑器功能较 ...

  2. 钢铁B2B电商案例:供应链金融如何解决供应链金融痛点

    一.区块链是什么 区块链是一种按照时间顺序将数据块以特定的顺序相连的方式组合成的链式数据结构,其上存储了系统诞生以来所有交易的记录.区块链上的数据由全网节点共同维护并共同存储,同时以密码学方式保证区块 ...

  3. SpringBatch从入门到放弃003- 核心概念2

    1. Job Job是一个封装了 Batch 整个执行过程的实体,和其他 Spring 工程一样,Job可以基于 XML 和 Java-based配置两种,但是无论使用怎样的配置,Job都在这个结构的 ...

  4. Android Studio配置Socks5代理后Gradle运行不正常

    第一次在Mac上运行Android Studio,遇到了一系列问题,其中一个代理问题搞得我是不知所措,在此记录. 如果你遇到了如下图的问题,那么恭喜你你可能已经找到了解决方案也就是本文: 一般,我们为 ...

  5. ArangoDB图数据库--总参

    参考文章: ArangoDB原生多模型数据库(百科) ArangoDB官网 ArangoDB数据库入门 arangodb-vs-cassandra arangodb-vs-mongodb2 Arang ...

  6. Emacs 学习之旅

    **Emacs 的使用过程,就像是程序员的生涯一样--路漫漫其修远兮,吾将上下而求索.** ## 万物始于 Emacs 最早知道 _Emacs_ 是从编辑器的圣战开始的,即编辑器之神--Vi,和神的编 ...

  7. 死磕 java线程系列之线程池深入解析——未来任务执行流程

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了线程池中普 ...

  8. 消息队列 ActiveMQ 、RocketMQ 、RabbitMQ 和 Kafka 如何选择?

    「 预计阅读 6 分钟 」 旁白:这是一篇拖更了N久的文章...0.0(看不见我~) 往期回顾 前端框架 jQuery 和 Vue 如何选择? 安全框架 Shiro 和 Spring Security ...

  9. 在虚拟机上的关于NFS网络文件系统

    小知识: NFS(Network Files System)即网络文件系统,NFS文件系统协议允许网络中的主机通过TCP/IP协议进行资源共享,NFS客户端可以像使用本地资源一样读写远端NFS服务端的 ...

  10. Golang的json包

    encoding/json encoding/json是官方提供的标准json, 实现RFC 7159中定义的JSON编码和解码.使用的时候需要预定义struct,原理是通过reflection和in ...