AcWing 528. 奶酪(每日一题)

目录

题目:

DFS(BFS):

并查集:

总结:


原题链接:528. 奶酪 - AcWing题库

题目:

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

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

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

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

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

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

输入格式

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

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

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

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

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

输出格式

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

数据范围

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

输入样例:

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

DFS(BFS):

看到这样的题直接考虑爆搜,去dfs每一个点看看是否满足条件,最后高度是否能到达h,在dfs上优化一下,我们可以sort排序一下每个点的高度,这样我遍历上可以一路走到头,比如我此时高度high=4,奶酪高度h=8,那么排序完之后,a[i].z<4的点我不用再去考虑了,在i+1基础上去遍历,使其优化一点。

相交或者相切条件: (x1-x2)^2+(y1-y2)^2+(z1-z2)^2<=(2*r)^2

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
ll n,r,h;
int T;
bool flag;//判断是否能到达h
const int N=1005;
struct node{//结构体存储
	ll x,y,z;
}a[N];
bool vis[N];//标记数组
bool cmp(node A,node B){//排序函数
	return A.z<B.z;
}
void dfs(int dep,int hig){//dep表示搜索第i个,hig为当前高度
	if(hig>=h){//大于h说明到达了,不需要再搜了
		flag=1;
		return;
	}
	vis[dep]=1;//不管能不能走先标记
	for(int i=dep+1;i<=n;i++){
		int x1=abs(a[i].x-a[dep].x);
		int y1=abs(a[i].y-a[dep].y);
		int z1=abs(a[i].z-a[dep].z);
		if(!vis[i]&&(ll)x1*x1+(ll)y1*y1+(ll)z1*z1<=(ll)4*r*r){//满足相交或相切条件
            dfs(i,a[i].z+r);//从i个开始搜,当前高度不要忘记加r
        }
	}
}
int main(){
	cin>>T;
	while(T--){
		cin>>n>>h>>r;
		for(int i=1;i<=n;i++){
			cin>>a[i].x>>a[i].y>>a[i].z;
		}
		flag=0;//多组输入注意初始化
		memset(vis,0,sizeof(vis));
		sort(a+1,a+n+1,cmp);
		for(int i=1;i<=n;i++){
			if(!vis[i]&&a[i].z<=r){//只要此点可以满足入口条件就可以进入搜,可以有多个入口
				dfs(i,a[i].z+r);
			}
			if(flag==1){//只要找到一种方案能到达h,任务就完成了
				break;
			}
		}
		if(flag==0){
			cout<<"No"<<endl;
		}else{
			cout<<"Yes"<<endl;
		}
	}
	return 0;
}

并查集:

y总讲解并查集解法:AcWing 528. 奶酪(每日一题)_哔哩哔哩_bilibili

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1010;
struct point{
    int x,y,z;
}pt[N];
int p[N];
int up[N],down[N];

double distance(point p1,point p2){
    return sqrt(pow(p1.x-p2.x,2)+pow(p1.y-p2.y,2)+pow(p1.z-p2.z,2));
}

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

int main(){
    int t;
    cin>>t;

    while(t--){
        int n,h,r;
        int t1 = 0,t2 = 0;
        cin>>n>>h>>r;

        for(int i = 1;i<=n;i++) p[i] = i;

        for(int i=1;i<=n;i++){
            cin>>pt[i].x>>pt[i].y>>pt[i].z;
            if(pt[i].z-r<=0) down[++t1] = i;//记录联通上下表面的点
            if(pt[i].z+r>=h) up[++t2] = i;
        }

        if(t1 == 0||t2 == 0) {
            cout<<"No"<<endl;
            continue;
        }

        //遍历所有的点处理连通集
        for(int i = 1;i<=n;i++)
           for(int j = i+1;j<=n;j++){
               if(find(i) == find(j)) continue;
               double dis = distance(pt[i],pt[j]);
               if(dis<=2*r) p[find(i)] = find(j);//合并
           }
        int flag = 0;
        //检查连通集
        for(int i = 1;i<=t1;i++){
            if(flag) break;
            for(int j = 1;j<=t2;j++){
                if(find(down[i]) == find(up[j]) ) {
                    cout<<"Yes"<<endl;
                    flag = 1;
                    break;
            }
        }
     }
     if(flag == 0) cout<<"No"<<endl;
   }
   return 0;

}

总结:

这类暴力搜索题一定要会,蓝桥杯每年都有这样暴力搜索题,后面还需要多加练习,文章写的急,若有错误请指出,大家一起加油。

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

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

相关文章

【C语言】内存函数(memmove)的使用和模拟实现

目录 前言memmove定义1.在cplusplus中的定义 memmove的模拟实现1、思路2、难点3、解决方法 模拟实现代码 前言 这篇文章讲述了memcpy的使用、模拟实现和一个未解决的问题内存函数(memcpy)的使用和模拟实现 当我们使用我们模拟的my_memcpy拷贝&#xff0c;当源拷贝地址与目标拷…

基于Axios封装请求---防止接口重复请求解决方案

一、引言 前端接口防止重复请求的实现方案主要基于以下几个原因&#xff1a; 用户体验&#xff1a;重复发送请求可能导致页面长时间无响应或加载缓慢&#xff0c;从而影响用户的体验。特别是在网络不稳定或请求处理时间较长的情况下&#xff0c;这个问题尤为突出。 服务器压力…

Intel Arc显卡安装Stable Diffusion

StableDiffusion是一种基于深度学习的文本到图像生成模型&#xff0c;于2022年发布。它主要用于根据文本描述生成详细图像&#xff0c;也可应用于其他任务&#xff0c;如内补绘制、外补绘制和在提示词指导下生成图像翻译。通过给定文本提示词&#xff0c;该模型会输出一张匹配提…

C语言编译与链接

前言 我们想一个问题&#xff0c;我们写的C语言代码都是文本信息&#xff0c;电脑能直接执行c语言代码吗&#xff1f;肯定不能啊&#xff0c;计算机能执行的是二进制指令&#xff0c;所以将C语言转化为二进制指令需要一段过程&#xff0c;这篇博客讲一下编译与链接&#xff0c;…

Go打造REST Server【二】:用路由的三方库来实现

前言 在之前的文章中&#xff0c;我们用Go的标准库来实现了服务器&#xff0c;JSON渲染重构为辅助函数&#xff0c;使特定的路由处理程序相当简洁。 我们剩下的问题是路径路由逻辑&#xff0c;这是所有编写无依赖HTTP服务器的人都会遇到的问题&#xff0c;除非服务器只处理一到…

【计算机网络篇】数据链路层(4.2)可靠传输的实现机制

文章目录 &#x1f354;可靠传输的实现机制⭐停止 - 等待协议&#x1f5d2;️注意 &#x1f50e;停止 - 等待协议的信道利用率&#x1f5c3;️练习题 ⭐回退N帧协议&#x1f388;回退N帧协议的基本工作流程&#x1f50e;无传输差错的情况&#x1f50e;超时重传的情况&#x1f5…

Nomad Web更新没有最快只有更快

大家好&#xff0c;才是真的好。 很长时间没介绍运行在浏览器中的Notes客户端即Nomad Web更新情况。 不用安装&#xff0c;直接使用&#xff0c;还可以完美地兼容适应各种操作系统&#xff0c;Nomad Web一定是Notes/Domino产品现在和将来重点发展的用户访问模式。 不过&…

wsl kali在无缝模式下显示kali桌面的问题

Seamless mode shows the kali desktop 无缝模式下&#xff0c;同时显示kali的Panel和桌面 In Settings -> Session and Startup -> Current Session Change the “Restart Style” for the xfdesktop entry to “Never” Restart Win-KeX 高阶玩法 在Windows Te…

【MATLAB源码-第172期】基于matlab的小波变换能量率BP神经网络的机械轴承故障分析以及识别,附带程序说明。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在现代工业生产中&#xff0c;轴承是最为常见和关键的机械基础部件之一&#xff0c;其性能状态直接影响着整个机械系统的稳定性和可靠性。由于轴承在运行过程中不断承受高负荷和摩擦&#xff0c;故障发生的概率相对较高。轴承…

ICLR2024:南洋理工发布!改几个参数就为大模型注入后门

随着大语言模型&#xff08;LLMs&#xff09;在处理自然语言处理&#xff08;NLP&#xff09;相关任务中的广泛应用&#xff0c;它们在人们日常生活中的作用日益凸显。例如&#xff0c;ChatGPT等模型已被用于各种文本生成、分类和情感分析任务。然而&#xff0c;这些模型潜在的…

HarmonyOS实战开发-如何实现一个支持加减乘除混合运算的计算器。

介绍 本篇Codelab基于基础组件、容器组件&#xff0c;实现一个支持加减乘除混合运算的计算器。 说明&#xff1a; 由于数字都是双精度浮点数&#xff0c;在计算机中是二进制存储数据的&#xff0c;因此小数和非安全整数&#xff08;超过整数的安全范围[-Math.pow(2, 53)&#…

如何使用Docker搭建WBO在线协作工具并实现无公网IP远程编辑本地白板

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

使用mybatis的@Interceptor实现拦截sql

一 mybatis的拦截器 1.1 拦截器介绍 拦截器是一种基于 AOP&#xff08;面向切面编程&#xff09;的技术&#xff0c;它可以在目标对象的方法执行前后插入自定义的逻辑。 1.2 语法介绍 1.注解Intercepts Intercepts({Signature(type StatementHandler.class, method “…

electron+VUE Browserwindow与webview通信

仅做记录 前言&#xff1a; electronVUEVITE框架&#xff0c;用的是VUE3.0 主进程定义&#xff1a;用于接收webview发送的消息 ipcMain.on(MyWebviewMessage, (event, message) > {logger.info(收到webmsg message)//转发给渲染进程}) porelaod/webPreload.js定义 cons…

C语言结合体和枚举的魅力展现

前言 ✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱’博客 所属栏目&#xff1a;人工智能 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 引言: 前面我们已经讲了结构体的声明&#xff0c;自引用&#xff0c;内存…

C++ 前K个高频单词的六种解法

目录 大堆 小堆 vectorsort vectorstable_sort multimap set/multiset 与GPT的对话 1.对于比较类型中 < 运算符重载的理解 2.map有稳定性的说法吗 ​编辑 3.为什么map和set类的仿函数后面要加const来修饰*this 5.关于名词的理解 6.匿名对象对类要求 7.map和set的…

面向对象:继承

文章目录 一、什么叫继承&#xff1f;二、单继承三、多继承3.1多继承的各种情况3.1.1一般情况3.1.1特殊情况&#xff08;菱形继承&#xff09; 四、菱形继承引发的问题4.1 问题1:数据冗余4.2 问题2:二义性&#xff08;无法确定到底是访问哪个&#xff09; 五、虚拟继承解决菱形…

深度剖析鞋服品牌商品数字化管理的重要性

随着信息技术的迅猛发展与市场竞争的加剧&#xff0c;鞋服品牌商品数字化管理的重要性愈发凸显。数字化管理不仅关乎企业运营效率的提升&#xff0c;更是品牌实现差异化竞争、提升顾客体验、构建智慧零售生态的关键所在。对于鞋服品牌企业而言&#xff0c;提升商品数字化管理的…

python中raise_for_status方法的作用

文章目录 说明示例1&#xff1a;基本使用示例2&#xff1a;多种异常 说明 raise_for_status() 方法在 Python 的 requests 库中用于在发送 HTTP 请求后检查响应的状态码。如果响应的状态码表示请求未成功&#xff08;即状态码不是 2xx&#xff09;&#xff0c;则该方法会抛出一…

C/C++中重载函数取地址的方法

目录 1.现象 2.指定参数取函数地址 3.利用Qt的类QOverload 1.现象 函数重载在C/C编码中是非常常见的&#xff0c;但是我们在std::bind或std::function绑定函数地址的时候&#xff0c;直接取地址&#xff0c;程序编译就会报错&#xff0c;示例如下&#xff1a; class CFunc1…