这个题是2017noip提高组的真题,是一个深度搜索题,得分轨迹:10-80-100pts。

在三维空间里,存在可能连通的洞(半径r),问是否可以通过这些洞从底部到达顶部。一开始我联想到了01迷宫,以联通块的方式求解,但发现不可。于是就单纯想用一个一维的dfs去枚举,发现这个dfs的时间复杂度很低,似乎每一个节点访问一遍即可。首先确定了每次要枚举的是当前的坐标,如果z+r>=h则flag=true,如果没有就for(1~n),打上标记,但在这里,每一个点只需要走一次就可以了,因为从2-4如果到不了,那么从3-4也到不了,所以不用回溯。但是需要有一个入口,那么要把dfs放到一个for里,如果z<=r,那么进去。但是对于数据类型的定义我出现了问题,请教了lz,hhs,lxy大佬。

1.要想骗到分或者代码写崩了,仔细看数据范围,比如这个题n=1,直接判断能不能到达底部和顶部就20分了。

2.多组数据输出时别忘了换行。

3.计算公式的正确性一定要保证,调试的时候心态放平,按部就班,应该可以找出来的。

4.对于数据的类型定义,sqrt要double,平方要long long这些都要想清楚

代码

 #include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct node{
double x;
double y;
double z;
}a[];
int book[];
int T;
int n,h;
long long r;
bool flag=false;
long long d;
long long dis(double x,double y,double z,double xx,double yy,double zz){
return ((x-xx)*(x-xx)+(y-yy)*(y-yy)+(z-zz)*(z-zz));
// return ((x-xx)^2+(y-yy)^2+(z-zz)^2);
}
void dfs(double x,double y,double z){
if(z+r>=h){
flag=true;
return;
}
if(flag==false){
for(int i=;i<=n;i++){
if(book[i]==){
//cout<<dis(x,y,z,a[i].x,a[i].y,a[i].z);
if(dis(x,y,z,a[i].x,a[i].y,a[i].z)<=r*r*){//相交或相切
book[i]=;
dfs(a[i].x,a[i].y,a[i].z);
//cout<<i<<endl;
}
}
else continue;
}
}
}
int main(){
scanf("%d",&T);
for(int i=;i<=T;i++){
flag=false;
cin>>n>>h>>r;
for(int i=;i<=n;i++){
cin>>a[i].x>>a[i].y>>a[i].z;
book[i]=;
}
for(int i=;i<=n;i++){
if(flag==true) break;
if(a[i].z<=r){
// cout<<i<<endl;
book[i]=;
dfs(a[i].x,a[i].y,a[i].z);
}
}
if(flag==true) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return ;
}

P3958奶酪的更多相关文章

  1. 洛谷 P3958 奶酪 并查集

    目录 题面 题目链接 题面 题目描述 输入输出格式 输入格式 输出格式: 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P3958 奶酪 题面 题目描述 现有一块大奶酪 ...

  2. P3958 奶酪

    传送门 思路: 模拟题.用并查集求出所有 “连通块” ,判断是否有 “连通块” 的最顶上和最下方都不小于奶酪的范围. Code: #include<iostream> #include&l ...

  3. 洛谷P3958 奶酪

    题目链接 这道题貌似可以用BFS来写吧qwq. 我用的是并查集,把联通的洞合并在同一个几何中,最后只需要判断是否存在上表面和下表面有相同集合的洞即可. 但是需要注意的是还有这样的一种情况:有一个大洞贯 ...

  4. 『题解』洛谷P3958 奶酪

    Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 现有一块大奶酪,它的高度为\(h\),它的长度和宽度我们可以认为是无 ...

  5. 洛谷 P3958 奶酪

    谨以此题来纪念我爆炸的NOIp2017 这个题虽然很多人说是并查集,但是搜索也是毫无压力的,考场搜索细节写挂,爆了个不上不下的80分.今天无意看到这道题,终于AC 首先这道题要考虑一下精度问题,虽然出 ...

  6. 洛谷P3958 奶酪 并查集

    两个空洞可互达当且仅当两个空洞相切,即球心距离小于等于球的直径. 一一枚举两个可互达的空洞,并用并查集连起来即可. Code: #include<cstdio> #include<c ...

  7. 洛谷 P3958 奶酪 题解

    思路: 先看哪两个点能互通,再广搜寻找下一步,如果到达高度h就输出Yes,如果所有路径都找过都不能到达高度h就输出No. #include<bits/stdc++.h> using nam ...

  8. 历年NOIP题

    做了几天远古老题,发现不可做,于是咕掉..转而从2005开始.. 1997: P1549 棋盘问题(2):搜索,优化搜索顺序,对于第一行第一列先搜小的(但是其实这样是错的,仅仅能过原题) 加强版咕. ...

  9. 浅谈并查集&种类并查集&带权并查集

    并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...

随机推荐

  1. javascript基本知识图解

    转载自 网络博客 变量 数据类型 javascript运算符 javascript流程语句 javascript 数组 javascript window对象 javascript DOM javas ...

  2. 【leetcode】689. Maximum Sum of 3 Non-Overlapping Subarrays

    题目如下: In a given array nums of positive integers, find three non-overlapping subarrays with maximum ...

  3. wed.xml 中 filter、servlet 配置格式

    1.wed.xml 中 filter 配置格式 <filter> <filter-name>filterName</filter-name> <filter- ...

  4. AJAX 实例解析

    AJAX 实例 为了帮助您理解 AJAX 的工作原理,我们创建了一个小型的 AJAX 应用程序: 实例 AJAX 不是新的编程语言,而是一种使用现有标准的新方法.深圳dd马达 AJAX 是与服务器交换 ...

  5. ACCESS数据库注入

    0X01 我们想来了解一下access数据库 Access注入是暴力猜解 Access数据结构(access只有一个数据库) Access数据库 表名 列名 数据 没有库这个概念 只有表这个概念 这应 ...

  6. vscode-php代码提升及函数跳转

    安装插件,php intellisense 安装后还要配置一下PHP的运行路径 打开扩展     输入 PHP IntelliSense     安装     文件 - 首选项 - 设置 - 扩展 - ...

  7. 微信小程序 导航(a 连接)自定义组件

    导航:navigator 组件 组件上的属性: target:跳到其他小程序( 默认是当前小程序 ),当属性值为 miniProgram 时,跳到别的小程序(如果要跳到别的小程序,需要填写 appid ...

  8. 搭建ORACLE11g_RAC_单实例_ADG 注意事项

    搭建ORACLE11g_RAC_单实例_ADG 建库时候的注意事项:实例名为orcl1SYS@orcl1>select instance_name from v$instance; INSTAN ...

  9. C语言:结构体中(.)和(->)的区别

    https://blog.csdn.net/faihung/article/details/79190039 这虽然是个小问题,但有时候很容易让人迷惑,因为有的时候用混淆了,程序编译不通过. 下面说说 ...

  10. org.hibernate.AssertionFailure: null id don't flus

    我的是字段编码和数据库不匹配,是爬的微博数据