ACM 三水杯
发布日期:2021-09-21 12:44:41 浏览次数:7 分类:技术文章

本文共 2026 字,大约阅读时间需要 6 分钟。

三个水杯

时间限制:
1000 ms  |  内存限制:
65535 KB
难度:
4
描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
样例输入
26 3 14 1 19 3 27 1 1
样例输出
3-1

我还是看了别人写的在自己琢磨了下,这是一个bfs问题 入队所有情况,遍历所有情况。当所有情况都被遍历完了就输出-1。

每次都wa  坑人的memset的头文件是cstring 用的vs2105没有报错 还是自己懂太少了  加油     写的不好见谅

#include<cstdio>

#include<cstdlib>

#include<iostream>

#include<algorithm>

#include<cstring>

#include<math.h>

#include<cmath>

using namespace std;

#define MAX 305

struct water {

int cup[3];

int time;

}Node[MAX];

int V[3], E[3];

int state[105][105][105];

int bfs(){

if (V[0] == E[0] && E[1] == 0 && E[2] == 0)

{

return 0; }

if (V[0] != E[0] + E[1] + E[2])

{

return -1; }

memset(state, 0, sizeof(state));//初始化所有状态为0

memset(Node, 0, sizeof(Node));

int rear = 1, deq = 0;//一个是队的长度另一个是出队的长度

Node[0].cup[0] = V[0];//初始状态放进去

state[Node[0].cup[0]][0][0] = 1;//初始状态标记

while (deq != rear)

{

//每次到法有六种

for (int i = 0;i < 3;i++)

{

for (int j = 0;j < 3;j++)

{

if (i != j&&Node[deq].cup[i]>0&&Node[deq].cup[j]<V[j])

{

int temp = (Node[deq].cup[i]) < (V[j] - Node[deq].cup[j])? (Node[deq].cup[i]):(V[j] - Node[deq].cup[j]);//找到到入得最小值

Node[rear].cup[i] = Node[deq].cup[i] - temp;

Node[rear].cup[j] = Node[deq].cup[j] + temp;

Node[rear].cup[3 - i - j] = Node[deq].cup[3 - i - j];//没有处理的杯子不变

if (state[Node[rear].cup[0]][Node[rear].cup[1]] [Node[rear].cup[2]]==0)

{

state[Node[rear].cup[0]][Node[rear].cup[1]][Node[rear].cup[2]] = 1;//把这个状态赋值为一 Node[rear].time = Node[deq].time + 1;//将上次的次数加一

if (Node[rear].cup[0] == E[0] &&

Node[rear].cup[1] == E[1] &&

Node[rear].cup[2] == E[2])

{return Node[rear].time;}

rear++;

}

}

}

}

deq++;//六种状态都没得出队 }

return -1;}

int main(){

int n;

scanf("%d", &n); while (n--)

{

memset(V, 0, sizeof(V));

memset(E, 0, sizeof(E));

scanf("%d%d%d", &V[0], &V[1], &V[2]);

scanf("%d%d%d", &E[0], &E[1], &E[2]);

printf("%d\n", bfs());

}

return 0; }

转载地址:https://blog.csdn.net/Dog_dream/article/details/78705641 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ACM 吝啬的国度
下一篇:JVM与JDK的区别

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年03月25日 16时36分44秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

db2与mysql编目_DB2编目、联邦数据库 - Goopand's OS Space - OSCHINA - 中文开源技术交流社区... 2019-04-21
atomikosdatasourcebean mysql_SpringBoot2整合JTA组件实现多数据源事务管理 2019-04-21
webpack 入口文件 php,如何实现webpack多入口文件打包配置 2019-04-21
php tire树,Immutable.js源码之List 类型的详细解析(附示例) 2019-04-21
matlab转差频率控制,转差频率控制的异步电机调速系统的研究 2019-04-21
oracle错误1327,Oracle中的PGA监控报警分析(r11笔记第97天) 2019-04-21
php函数内的循环,PHP 循环列出目录内容的函数代码 2019-04-21
oracle树状排序,Oracle树状结构查询 2019-04-21
深度linux内核升级,深度操作系统 2020.11.11 更新发布:内核升级 2021-06-24
sql 拆解函数_SQL入门50题详解(含知识点讲解及代码运行步骤拆解) 2021-06-24
java和python交互 jni_Python基于pyjnius库实现访问java类 2021-06-24
macbook pro 卸载mysql_MacBook Pro全新重装OS X Yosemite 2021-06-24
已达到计算机的连接数最大值无法再同此远程计算机连接_电脑远程访问已达到计算机的连接数最大值怎么办?解决方法很简单... 2021-06-24
mysql表名长度_JavaWeb之MySQL(一) 2021-06-24
mysql服务器语法_Mysql语法 2021-06-24
pdf 模版 汉字和数字_《吉林大学珠海学院毕业论文(设计)模板》(汉字标题版) .pdf... 2021-06-24
python bottle部署_nginx+uwsgi+bottle python服务器部署 2021-06-24
python双击py一闪_Python脚本在双击.py时无法正常运行 2021-06-24
redis logfile为空_关于Redis(二) 2021-06-24
mysql 设计两个主键都不可重复_程序员面试备战篇:18个经典MySQL面试专题解析(干货分享答案)... 2021-06-24