奶酪(蓝桥杯,acwing,并查集)

现有一块大奶酪,它的高度为 hℎ,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。

我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为 z=0,奶酪的上表面为 z=h。 

现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在的坐标。

如果两个空洞相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个空洞,特别地,如果一个空洞与下表面相切或是相交,Jerry 则可以从奶酪下表面跑进空洞;如果一个空洞与上表面相切或是相交,Jerry 则可以从空洞跑到奶酪上表面。

位于奶酪下表面的 Jerry 想知道,在不破坏奶酪的情况下,能否利用已有的空洞跑到奶酪的上表面去? 

空间内两点 P1(x1,y1,z1)、P2(x2,y2,z2)的距离公式如下:

输入格式:

每个输入文件包含多组数据。  

输入文件的第一行,包含一个正整数 T,代表该输入文件中所含的数据组数。  

接下来是 T� 组数据,每组数据的格式如下:

第一行包含三个正整数 n,ℎ 和 r,两个数之间以一个空格分开,分别代表奶酪中空洞的数量,奶酪的高度和空洞的半径。  

接下来的 n 行,每行包含三个整数 x、y、z两个数之间以一个空格分开,表示空洞球心坐标为 (x,y,z)

输出格式:

输出文件包含 T 行,分别对应 T 组数据的答案,如果在第 i组数据中,Jerry 能从下表面跑到上表面,则输出 Yes,如果不能,则输出 No

数据范围:

1≤n≤1000
1≤h,r≤1e9,
T≤20,
坐标的绝对值不超过1e9

输入样例:

3 
2 4 1 
0 0 1 
0 0 3 
2 5 1 
0 0 1 
0 0 4 
2 5 2 
0 0 2 
2 0 4

输出样例:

Yes
No
Yes

分析步骤:

  第一:拿到这道题我们就可以知道,这是一道关于通道的问题,你要判断是否有一条从底部可以走到上表面的路径,如果有就成功了。所以看到这里我们就可以想到,将各个圆心的点判断是否能链接到一起,,如果可以就把他们放到一个集合之中。由此可以知道运用并查集。通过并查集,将两两相交或相切的两个空洞连在一起,然后再判断在同一个并查集中的点的最高位和最低为是否能够到达奶酪的顶和底即可。

  第二:书写主函数,构建整体架构:

             将相应的只输入进去,将并查集数组自我更新数值,意义是将自己的父节点定义为自己。

             随后输入横,纵,高的坐标,将其收入进  q  数组 。由此我们首先要判断是否有节点和底部 和 上表面连接在一起,如果有的话则将其进行压缩路径 p[ find(i) ] = find(0)意思是 i 的根节点的父节点 是 0 的根节点  ;  p[ find(i) ] = find(n + 1)意思是 i 的根节点的父节点 是 n+1 的根节点

cin>>t;
    while(t--){
        
    cin>>n>>h>>r;
    for(int i = 0 ; i <= n +1 ; i ++) p[i] = i;
    for(int i = 1 ; i <= n ; i ++){
      int x, y, z;
      cin>>x>>y>>z;
      q[i] = {x,y,z};
      if(abs(z) <= r) p[find(i)] = find(0);
      if(abs(z - h) <= r) p[find(i)] = find(n+1);
    }

               随后遍历每一个点 , 判断他们是不是相交或者相切,如果是的话 则将 i 的根节点的父节点 改为 j 的父节点

               最后判断底部的节点0 和 上表面的节点n+1 是否在同一个集合,如果是则代表他们之中必定有个通道,可以从底部道顶端,于是输出yes。


    for(int i = 1 ; i <= n ; i ++){
        for(int j = 1 ; j < i ; j++){
            LL sx = q[i].x - q[j].x;
            LL sy = q[i].y - q[j].y;
            LL sz = q[i].z - q[j].z;
            if(sx*sx+sy*sy+sz*sz <= 4*(LL)r*r)
            p[find(i)] = find(j);
        }
    }
    
    if (find(0) == find(n + 1)) puts("Yes");
        else puts("No");
    
 

  第三:书写find 函数

             如果 x 的 根节点 是自己的话就返回

             如果不是的话则进行状态压缩,将x的父节点的父节点的值 赋予 x的父节点,这样在这一条路径下的点都聚集在根节点处了

int find(int x){
    if(x == p[x]) return x;
    return p[x] = find(p[x]);
}

  第四:这是我给大家画的样例图片,大家可以好好照着理解一下,理解一下什么是路径压缩,他是运用递归的思想,不断向上去寻找最根节点的根节点在哪里 , 找到了之后我们就依次返回,最终将路径上的每个点的父节点都变为根节点 

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
typedef long long LL;

using namespace std;

const int N = 1100;

struct node{
    int x, y, z;
}q[N];
int p[N];
int t,n,r,h;


int find(int x){
    if(x == p[x]) return x;
    return p[x] = find(p[x]);
}




int main()
{
    cin>>t;
    while(t--){
        
    cin>>n>>h>>r;
    for(int i = 0 ; i <= n +1 ; i ++) p[i] = i;
    for(int i = 1 ; i <= n ; i ++){
      int x, y, z;
      cin>>x>>y>>z;
      q[i] = {x,y,z};
      if(abs(z) <= r) p[find(i)] = find(0);
      if(abs(z - h) <= r) p[find(i)] = find(n+1);
    }
    
    for(int i = 1 ; i <= n ; i ++){
        for(int j = 1 ; j < i ; j++){
            LL sx = q[i].x - q[j].x;
            LL sy = q[i].y - q[j].y;
            LL sz = q[i].z - q[j].z;
            if(sx*sx+sy*sy+sz*sz <= 4*(LL)r*r)
            p[find(i)] = find(j);
        }
    }
    
    if (find(0) == find(n + 1)) puts("Yes");
        else puts("No");
    
    }
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/482181.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器租用费用_公司官网多少钱一年?

阿里云服务器租用费用&#xff0c;搭建公司官网多少钱一年&#xff1f;搭建公司官网推荐2核4G5M带宽&#xff0c;优惠价199元一年&#xff0c;ECS u1实例企业客户专享&#xff0c;2核4G&#xff0c;5M固定带宽&#xff0c;80G ESSD Entry盘&#xff0c;活动页面 aliyunfuwuqi.c…

两数之和(python)

官方题目描述&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现…

国际品牌交期长 雷卯来帮忙

在当今的电子元器件市场中&#xff0c;防静电电子元器件的需求日益增长。无论是通信安防、医疗、消费类电子、照明行业、航空航天还是汽车电子等领域都会使用到防静电产品&#xff0c;使得防静电电子元器件的需求也呈现出爆发式的增长。在这一市场中&#xff0c;雷卯品牌凭借其…

JavaScript原型、原型对象、原型链系列详解(一)

(一)、JavaScript原型 原型 JavaScript 是一门面向对象的编程语言&#xff0c;其中原型&#xff08;prototype&#xff09;是一个重要的概念&#xff0c;它提供了一种创建对象的方式&#xff0c;使对象可以共享属性和方法。在 JavaScript 中&#xff0c;每个对象都有一个原型&a…

[医学分割大模型系列] (1) SAM 分割大模型解析

[医学大模型系列] [1] SAM 分割大模型解析 1. 特点2. 网络结构2.1 Image encoder2.2 Prompt encoder2.3 Mask decoder 3. 数据引擎4. 讨论 论文地址&#xff1a;Segment Anything 开源地址&#xff1a;https://github.com/facebookresearch/segment-anything demo地址&#x…

常见六大WEB安全问题

一、XSS跨站脚本攻击 1.Cross-Site Scripting&#xff08;跨站脚本攻击&#xff09;简称 XSS&#xff08;因为缩写和 CSS重叠&#xff0c;所以只能叫 XSS&#xff09;&#xff0c;是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本&#xff0c;使之在用户的浏览器上运行…

如何在没有备份的情况下恢复 Android 上已删除的照片?

丢失 Android 设备上的珍贵照片可能是一场噩梦&#xff0c;尤其是在没有备份的情况下。无论是意外删除图像还是由于Android 崩溃而丢失图像&#xff0c;一想到它们可能会永远消失就令人沮丧。幸运的是&#xff0c;有多种方法可以在 Android 上恢复已删除的照片。 如何在没有备份…

声控小助手:文本语音呼唤技术的应用与实现

title: 声控小助手&#xff1a;文本语音呼唤技术的应用与实现 date: 2024/3/22 18:20:42 updated: 2024/3/22 18:20:42 tags: 文本语音呼唤技术原理Python实现优缺点分析应用场景未来展望人机交互 1. 引言 在当今数字化时代&#xff0c;文本语音呼唤技术正逐渐成为人们生活中…

内存卡的照片怎么突然就找不到了,内存卡照片突然找不到如何恢复

最近,我遇到了一个令人困惑的问题,就是我的内存卡中的照片突然间找不到了。作为一个热爱摄影的人,我经常使用内存卡来存储我的珍贵照片。然而,最近我发现,无论我如何搜索和浏览,这些照片似乎就像消失了一样。内存卡照片突然找不到如何恢复?虽然挺沮丧的,但幸好遇上了以…

arm 解决Rk1126 画框颜色变色问题(RGB转NV12)

在Rv1126上直接对Nv12图像进行绘制时&#xff0c;颜色是灰色。故将Nv12转BGR后绘制图像&#xff0c;绘制完成后转成Nv12&#xff0c;BGR的图像颜色是正常的&#xff0c;但是NV12的图像颜色未画全&#xff0c;如图&#xff1a; 1.排查发现是RGB转NV12的函数出现问题&#xff0c…

【JS】滑动验证实现

功能需求&#xff1a;&#xff08;图片可根据自行更换&#xff09; 1.、右侧标签的位置是随机生成&#xff0c;左侧标签和右侧标签的垂直位置是一致的&#xff0c; 2、通过滑动条控制左侧标签与右侧标签重叠&#xff08;误差控制在2px&#xff09;表示验证通过&#xff0c; …

安卓手机系统跳过app启动广告软件

跳过广告关于此应用声明&#xff1a; 应用利用了安卓系统的辅助功能API&#xff0c;可以读取您手机屏幕上显示的所有内容&#xff0c;并且可以以您的名义进行屏幕点击等操作。* 轻量无广告&#xff0c;不联网&#xff0c;也不需要任何权限&#xff1b;* 请务必在系统设置中开启…

链表oj测试题(上)

链表的申明&#xff1a; struct ListNode {int val;struct ListNode* next; }; 1.题1 删除指定元素 例如&#xff1a;链表1 2 6 3 4 5 6&#xff0c;然后选择删除元素6&#xff0c;返回的链表为1 2 3 4 5 。 代码演示&#xff1a; typedef struct ListNode ListNode;List…

Linux文件 profile、bashrc、bash_profile区别

Linux系统中&#xff0c;有三种文件 出现的非常频繁&#xff0c;那就是 profile、bash_profile、bashrc 文件。 1、profile 作用 profile&#xff0c;路径&#xff1a;/etc/profile&#xff0c;用于设置系统级的环境变量和启动程序&#xff0c;在这个文件下配置会对所有用户…

学习刷题-12

3.22 hw机试【双指针】 Leetcode674 最长连续递增序列 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 双指针 一个慢指针一个快指针 慢指针记录递增子序列起点&#xff0c;快指针去寻找还在当前递增子序列的最后一…

C++例子

#include<iostream> using namespace std;//抽象类 //抽象cpu类 class CPU { public:virtual void calcuate()0; }; //抽象显卡类 class VideoCard { public:virtual void display()0; }; //抽象内存条类 class Memory { public:virtual void storage()0;};//电脑类 clas…

leetcode 150.逆波兰表达式求值

题目 思路 逆波兰表达式也是经典的栈的应用问题。 先说什么是逆波兰表达式&#xff08;也叫后缀表达式&#xff09; 我们习惯的是这样的表达式&#xff1a;1 2 / 3 ,这也叫中缀表达式。 但是对于计算机来说不好理解&#xff0c;当从左扫描到 2 的时候还需要再判断2后面是什…

损失函数篇 | YOLOv8更换损失函数之CIoU / DIoU / EIoU / GIoU / SIoU / WIoU

前言:Hello大家好,我是小哥谈。损失函数是机器学习中用来衡量模型预测值与真实值之间差异的函数。在训练模型时,我们希望通过不断调整模型参数,使得损失函数的值最小化,从而使得模型的预测值更加接近真实值。不同的损失函数适用于不同的问题,例如均方误差损失函数适用于回…

vue2从基础到高级学习笔记

在实际的工作中,我常使用vue的用法去实现效果,但是你要是问我为什么这样写,它的原理是啥就答不上来了。对vue的认知一直停留在表面,写这篇文章主要是为了理清并弄透彻vue的原理。 学习目标 1 学会一些基本用法的原理 2 弄懂vue核心设计原理 3 掌握vue高级api的用法 一 vue…

基于springboot+vue的小型诊疗预约平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…