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.hqwc.cn/news/579198.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手撕算法-跳跃游戏

描述 分析 如果某一个作为 起跳点 的格子可以跳跃的距离是 3&#xff0c;那么表示后面 3 个格子都可以作为 起跳点可以对每一个能作为 起跳点 的格子都尝试跳一次&#xff0c;把 能跳到最远的距离 不断更新如果可以一直跳到最后&#xff0c;就成功了 代码 class Solution {…

001搭建前端环境—“01红C”的java项目【苍穹外卖】

整个项目是采用前后端分离的方式开发的 1. 前端工程基于nginx 2. 启动nginx&#xff0c;访问测试 双击 nginx.exe 即可启动 nginx 服务&#xff0c;访问端口号为 80 http://localhost:80

阿里云2核4G服务器租用价格30元、165元和199元1年

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

公安可视化分析指挥调度平台的构成要素

匠心接单中...8年前端开发和UI设计接单经验&#xff0c;完工项目1000&#xff0c;持续为友友们分享有价值、有见地的干货观点&#xff0c;有业务需求的老铁&#xff0c;欢迎关注发私信。 公安可视化分析指挥调度平台是一个集成了多种技术和功能的综合性平台&#xff0c;主要由…

Vue中使用Vuex(超详细)基本使用方法

在vue中使用vuex&#xff0c;不同的vue版本要对应使用不同的vuex&#xff0c;在这里不做详情介绍&#xff0c;想具体了解的&#xff0c;请自行度娘或者必应一下。 在使用vuex之前&#xff0c;我们创建一个新的项目&#xff0c;这里我们使用的是vue的脚手架创建一个vue项目。 …

c语言中动态内存管理

说到内存&#xff0c;大家一定都知道。但是有一种函数可以实现动态内存管理&#xff0c;下面大家一起学习。 文章目录 一、为什么要有动态内存管理&#xff1f;二、malloc 和 free1.malloc2.free 三、calloc 和 realloc1.calloc2.realloc3.常见的动态内存的错误3.1对NULL指针的…

账号微服务短信验证码发送工具单元测试

账号微服务短信验证码发送工具单元测试 注意sms的 app-code #----------sms短信配置-------------- sms:app-code: dd7829bedfaf4373875aa91abba82523template-id: JM1000372package net.xdclass.config;import org.springframework.context.annotation.Bean; import org.spri…

基于JSPM的美食推荐管理系统

背景 互联网的迅猛扩张彻底转变了全球各类组织的运营模式。自20世纪90年代起&#xff0c;中国各级政府和企事业单位便开始探索运用网络系统来处理管理事务。然而&#xff0c;早期的网络覆盖不广、用户接受度不高、相关网络法规不健全以及技术发展不成熟等因素&#xff0c;都曾…

linux之进程控制

目录 一、fork函数 1.进程&#xff1a; 2.fork函数&#xff1a; 3.写时拷贝 4.fork常规用法 5.fork调用失败的原因 二、进程终止 1.终止是在做这么&#xff1f; 2.进程终止的3种情况 3.如何终止 三、进程等待 四、进程程序替换 1.替换原理 2.原理 3.将代码改成多…

C# 学习第五弹——语句

一、if语句 —简单if语句 —if else 语句 —if else if else 语句 1、简单if语句 if&#xff08;表达式&#xff09;{语句} &#xff08;1&#xff09;表达式必须使用圆括号括起来&#xff1b; &#xff08;2&#xff09;表达式&#xff1a;关系表达式或逻辑表达…

蓝桥杯第十五届抱佛脚(五)DFS、BFS及IDS

蓝桥杯第十五届抱佛脚&#xff08;五&#xff09;DFS、BFS及IDS 深度优先搜索 DFS(Depth-First Search)即深度优先搜索,是一种用于遍历或搜索树或图的算法。它从根节点开始,尽可能沿着每一条路径直到这条路径最后一个节点被访问了,然后回退,继续访问下一条路径。它的基本思想…

wiztree免费的c盘清理软件

现如今&#xff0c;我们无论是工作还是学习&#xff0c;都已经离不开电脑了&#xff0c;经常使用电脑就会导致电脑的“垃圾”越来越多&#xff0c;从而导致磁盘爆红。 相信大家多多少少都体会过这大红的压迫感吧&#xff0c;想清理但是不敢删&#xff0c;不清理吧软件用不了&a…