NYOJ21 【三个水杯】

2024-08-23 15:08
文章标签 nyoj21 水杯 三个

本文主要是介绍NYOJ21 【三个水杯】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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




 //NYOJ21_BFS
#include <stdio.h>
#include <string.h>
#include <queue>
using std::queue;struct Node{int v[3];int steps;
} init, targ;
bool vis[100][100][100];bool del(Node &cup, int start, int end){if(cup.v[start] && cup.v[end] != init.v[end]){ //能倒水int sum = cup.v[start] + cup.v[end];if(sum >= init.v[end]) cup.v[end] = init.v[end];else cup.v[end] = sum;cup.v[start] = sum - cup.v[end];if(!vis[cup.v[0]][cup.v[1]][cup.v[2]])return vis[cup.v[0]][cup.v[1]][cup.v[2]] = true;			}return false;
}int BFS(){Node cup = {init.v[0], 0, 0, 0}, temp;queue<Node> Q;memset(vis, 0, sizeof(vis));vis[init.v[0]][0][0] = true;Q.push(cup);while(!Q.empty()){temp = cup = Q.front();if(temp.v[0] == targ.v[0] && temp.v[1] == targ.v[1]&& temp.v[2] == targ.v[2]) return temp.steps;Q.pop();for(int i = 0; i < 3; ++i){			for(int j = 0; j < 3; ++j){temp = cup;if(i != j && del(temp, i, j)){					++temp.steps;					Q.push(temp);		}}}}return -1;
}int main(){int t;scanf("%d", &t);while(t--){scanf("%d%d%d", init.v, init.v + 1, init.v + 2);scanf("%d%d%d", targ.v, targ.v + 1, targ.v + 2);printf("%d\n", BFS());}return 0;
}        






这篇关于NYOJ21 【三个水杯】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1099731

相关文章

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

OOP三个基本特征:封装、继承、多态

OOP三个基本特征:封装、继承、多态 C++编程之—面向对象的三个基本特征 默认分类 2008-06-28 21:17:04 阅读12 评论1字号:大中小     面向对象的三个基本特征是:封装、继承、多态。     封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。   封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信

三个同步与互斥问题之生产者与消费者

#include<stdio.h> #include<pthread.h> pthread_mutex_t  mutex; #define Max 10 pthread_cond_t pro; pthread_cond_t con; int buffer=0;//全局变量----一开始为0,只有生产者可以执行 void deal_produce(

三个同步与互斥问题之哲学家就餐

#include<stdio.h> #include <semaphore.h> #include<pthread.h> //筷子作为mutex   pthread_mutex_t chopstick[5] ;   int eatnum[5]={5,5,5,5,5}; void *eat_think(void *arg)   {       int i= *(cha

【linux 磁盘管理】Linux磁盘管理常用三个命令为df、du和fdisk。

Linux磁盘管理好坏管理直接关系到整个系统的性能问题。 Linux磁盘管理常用三个命令为df、du和fdisk。 df:列出文件系统的整体磁盘使用量du:检查磁盘空间使用量fdisk:用于磁盘分区 [root@izbp1f0leha0lvmqfhigzpz code]# dfFilesystem 1K-blocks Used Available Use% Mounted

发现个有趣的东西:Tweetable Mathematical Art(用三个140字符以内的函数生成一个1024尺寸的图片)

发现 我是在看《构建之法》这本书时,看到作者提到这个: 好厉害!用三段140字符以内的代码生成一张1024×1024的图片_IT新闻_博客园 这是2014年一个人在 Code Golf Stack Exchange (a question and answer site for programming puzzle enthusiasts and code golfers) 发起的编程挑战:

相机拍摄时最重要的三个参数——光圈、快门、ISO

如果你对相机只有很少了解,那么看这篇文章再好不过啦,我结合很多资料,力图用最通俗易懂的方式进行讲解。 相机拍摄时最重要的3个参数就是——光圈、快门、ISO 次重要的参数有——焦距、景深、曝光   在介绍光圈、快门、ISO之前,必须先介绍曝光。曝光准确的照片:   过曝的照片:   欠曝的照片:   我们把一张完美曝光的照片理解成一桶刚刚装满的水,不

探索Python中的Ellipsis:不仅仅是三个点

在Python 3.9中,Ellipsis 对象被赋予了一个新名称,即 ...,这使得它更容易输入和使用。这个变化是在Python 3.9版本中引入的,而不是3.1。这个变化的好处包括: 易用性:使用 ... 比输入 Ellipsis 更快,因为它只需要输入三个点,而不是一个完整的单词。 一致性:在Python中,None、True 和 False 都是特殊的单例值,它们都有简短的别名(No

【C++ 前缀和 状态机dp】2826. 将三个组排序

本文涉及的基础知识点 C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 C++动态规划 LeetCode2826. 将三个组排序 给你一个整数数组 nums 。nums 的每个元素是 1,2 或 3。在每次操作中,你可以删除 nums 中的一个元素。返回使 nums 成为 非递减 顺序所需操作数的 最小值。 示例 1: 输入:nums = [2,1,3,2,1] 输

护眼灯真的可以保护眼睛吗?曝光劣质护眼台灯常见的三个特征

护眼灯真的可以保护眼睛吗?随着时代的发展,我们注意到越来越多的孩子开始佩戴眼镜。这一趋势引起了许多细心家长的关注,他们认识到这不仅是个别情况,而是现代生活方式和环境对孩子视力健康的挑战。自然而然地,“儿童是否应该使用护眼灯”成为了家长们关心的问题。作为专业测评师,我将针对这一问题提供多维度的科普知识。如果你正在考虑购买护眼灯,不妨花一点时间继续阅读下文。 一、护眼灯真的可以保护眼睛吗?