nyoj 21-三个水杯(BFS)
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)的更多相关文章
- 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 题目21 三个水杯
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...
- 三个水杯 (bfs)
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的 ...
- nyoj 三个水杯
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只 ...
- 三个水杯(BFS)
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 给出三个水杯.大小不一,而且仅仅有最大的水杯的水是装满的,其余两个为空杯子. 三个水杯之间相互倒水,而且水杯 ...
随机推荐
- PHP get_object_vars 和 get_class_vars
<?php class Girl { public $id = 1; public $name = 'zhy'; } $girl = new Girl(); var_dump(get_class ...
- django1-环境搭建
我的环境:win10 + pycharm2019.1.3 + python3.6.5 + Django2.1.10 安装django cmd下执行:pip install django==2.1.10 ...
- “selenium.common.exceptions.SessionNotCreatedException: Message: Unable to find a matching set of capabilities“解决办法
问题: 原因:firefox浏览器版本和浏览器驱动版本不匹配 解决办法:卸载高版本浏览器,安装低版本浏览器 下载地址:http://ftp.mozilla.org/pub/firefox/releas ...
- MyBatis 之源码浅读
环境简介与入口 记录一下尝试阅读Mybatis源码的过程,这篇笔记是我一边读,一遍记录下来的,虽然内容也不多,对Mybatis整体的架构体系也没有摸的很清楚,起码也能把这个过程整理下来,这也是我比较喜 ...
- 查看java内存情况的几个常用命令
java 命令简单查看jvm内存使用状况 jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序, ...
- V2er - Best client for V2EX
V2er - Best client for V2EX 可能是体验最好的掌上 V2EX 客户端,专为 iOS 打造并在 Github 开源. 关于 V2EX,V2EX 是创意工作者们的社区.这里目前汇 ...
- js小数加减乘除时精度不准确
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_33237207/article/d ...
- 在npm上发布自己的vue组件库(使用npm install 或者 CDN的方式引用)
一.npm publish发布包到npm库的命令是npm publish npm publish发布包,需要先配置webpack.json文件,如果没有webpack.json文件,可以通过npm i ...
- .NET webAPI中集成swagger
最近做的项目使用winform三层+webapi,对于webAPI路由文档管理一直觉得单独做一些管理比较麻烦,并且测试的时候项目内的代码测试运行起来也比较麻烦,所以在网上开始检索相关办法,发现热度比较 ...
- 第一篇 Flask初识
一. Python 现阶段三大主流Web框架 Django Tornado Flask 对比 1.Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不 ...