题目描述

现有一块大奶酪,它的高度为> h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为z> = 0,奶酪的上表面为z = h。现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在的坐标。如果两个空洞相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个空洞,特别地,如果一个空洞与下表面相切或是相交,Jerry 则可以从奶酪下表面跑进空洞;如果一个空洞与上表面相切或是相交,Jerry 则可以从空洞跑到奶酪上表面。 位于奶酪下表面的 Jerry 想知道,在不破坏奶酪的情况下,能否利用已有的空洞跑到奶酪的上表面去? 空间内两点P(x ,y ,z )、P(x ,y ,z )的距离公式如下:

dist(p1,p2)=sqrt((x1-x2)^2 +(y1-y2)^2 +(z1-z2)^2)

输入

输入文件的第一行,包含一个正整数 T,代表该输入文件中所含的数据组数。接下来是 T组数据,每组数据的格式如下: 第一行包含三个正整数 n,h,和 r ,两个数之间以一个空格分开,分别代表奶酪中空洞的数量,奶酪的高度和空洞的半径。接下来的 n行,每行包含三个整数 x,y,z,两个数之间以一个空格分开,表示空 洞球心坐标为 (x,y,z)。

输出

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

样例输入

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

提示

对于100%数据 1<=n<=1000,1<=h,r<=1,000,000,000,T<=20,坐标的绝对值不超过1,000,000,000

灌水法关键解题思路

1、将所有洞的坐标分别读入三个一维数组,数组的序号对应每个洞的id;
2、先找到所有与顶部和底部相交和相切的洞,将洞的id分别标识存放;
3、创建一个与洞坐标数组对应的一维数组用于存放洞中是否被“灌水”的标识;
4、从底部其中一个洞的id开始灌水,找到所有符合题目判定条件的相邻的洞,将“灌水”标识置为1,利用递归调用迭代检查所有相邻的洞,如果已经被灌过水则跳过,直至所有洞都遍历完成。
5、检查所有顶部的洞的灌水标识符是否为1,如果有任意一个洞的标识为1,则代表该洞与底部联通,否则判定没有与底部联通的洞存在。

样例代码

#include <iostream>
#include <cstdio>
#include <cmath>
#define MAXN 1001
#define ll long long
using namespace std;//fa[i]为洞内的水,fa[i] == 1 代表已i号洞穴经被灌满水
//tot_top表示通到顶上的洞的个数,tot_bottom表示通到底部的洞的个数
//top[i]表示第i个通到顶上的洞,bottom[i]表示第i个通到底部的洞
int fa[MAXN], t, n, top[MAXN], bottom[MAXN], tot_top, tot_bottom;
ll x[MAXN], y[MAXN], z[MAXN], r, h, p;
double cnt_dis(ll x, ll y, ll z, ll x1, ll y1, ll z1) //计算两圆心之间的距离
{double ans;ans = sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1) + (z - z1) * (z - z1));return ans;
}int check2r(int id_1, int id_2)
{if (cnt_dis(x[id_1], y[id_1], z[id_1], x[id_2], y[id_2], z[id_2]) <= p) {return 1;}else {return 0;}
}void flod(int id)
{   //灌水算法,大水漫灌所有相邻的洞穴,最后去检查顶部的洞穴中是否有水即可for (int j = 1; j <= n; j++) {if (fa[j]) continue;//cout << "flod_j" << j << endl;if (check2r(j, id)) {fa[j] = 1;flod(j);}}
}int main()
{cin >> t;if (t > MAXN) exit -1; //超过允许的上限for (int i = 1; i <= t; i++) {cin >> n >> h >> r; //scanf("%d %lld %lld", &n, &h, &r);tot_top = 0; tot_bottom = 0;p = 2 * r;for (int j = 1; j <= n; j++) { //将所有洞清空 fa[j] = 0;}for (int j = 1; j <= n; j++) {cin >> x[j] >> y[j] >> z[j]; //scanf("%lld %lld %lld", &x[j], &y[j], &z[j]);if (z[j] + r >= h) {   //找所有通到顶部的洞 tot_top++;top[tot_top] = j;//cout << "top" << j << endl;}if (z[j] - r <= 0) {   //找所有通到底部的洞 tot_bottom++;bottom[tot_bottom] = j;//cout << "bot" << j << endl;}}for (int j = 1; j <= tot_bottom; j++) { //开始灌水fa[bottom[j]] = 1;flod(bottom[j]);}int s = 0;for (int j = 1; j <= tot_top; j++) { //检查顶部的所有洞穴中是否有水,只要发现一个有水的就退出if (fa[top[j]]) {s = 1;break;//cout << "fa" << fa[top[j]] << endl;}}if (s == 1) cout << "Yes" << endl;else cout << "No" << endl;}
}

用灌水法解NOIP2017提高组D2第一题:奶酪相关推荐

  1. JZOJ 5476. 【NOIP2017提高组正式赛】奶酪

    Description 现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多 半径相同 的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为z = ...

  2. NOIP2017提高组比赛总结

    NOIP2017提高组比赛总结 前言 转眼间,NOIP2017(经常叫他NOIP,其实全称是全国青少年信息学奥林匹克联赛)就这么过去了.回望这2个月,既有参加NOIP的激动,也有赛场上一些失利的遗憾. ...

  3. [NOIp2017提高组]奶酪(BFS)

    [NOIp2017提高组_Day2T1]奶酪 1 #include<iostream> 2 #include<stdio.h> 3 #include<vector> ...

  4. P3959 [NOIP2017 提高组] 宝藏

    P3959 [NOIP2017 提高组] 宝藏 题意: 额题意不好说,就是n个点m个边,选定一个点为根节点,构造一个最小生成树,边的权值为该该边起点到根节点之间的点的数量K(不含根节点) * 道路长度 ...

  5. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...

  6. [NOIP2017 提高组] 时间复杂度

    题目 时间复杂度[NOIP2017提高组] 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明 ...

  7. 【NOIP2017提高组】列队

    题目背景 NOIP2017提高组 DAY2 T3 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵.Sylvia 所在的方阵中 ...

  8. P3951 [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目

    [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目 题目背景 NOIP2017 提高组 D1T1 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每 ...

  9. 【NOIP2017提高组】小凯的疑惑

    小凯的疑惑 题目背景 NOIP2017提高组 DAY1 T1 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无 ...

最新文章

  1. 如何将adb shell里面查到的文件复制到本地电脑
  2. sencha touch 模仿tabpanel导航栏TabBar(2013-11-7)
  3. Java实训项目12:GUI学生信息管理系统 - 实现步骤 - 创建服务接口实现类
  4. 【GNN】图神经网络入门之GRN图循环网络
  5. 测试 jdbc 中连接关闭的时机
  6. LeaRun快速开发平台:企业供应链管理系统解决方案
  7. Python转义字符及用法
  8. 组策略 控制台登录计算机用用户,更方便的管理计算机!Windows组策略应用全攻略一...
  9. HTTP/2 协议详解
  10. Enhanced Assertions
  11. 关于北大青鸟????
  12. RockChip Android平台抓取android trace的windows环境搭建
  13. ubuntu配置IP地址,网关,DNS和路由
  14. latex数学公式(行内(间)公式标注/希腊字母/数学函数/配对括号/定理环境
  15. 新鲜出炉 日常家用电器电磁辐射危险排行榜(iPad3 iMac)
  16. Xcode创建的工程使用xcodebuild命令行编译
  17. 名人堂:网络缔造者—互联网之父VintonG.Cerf
  18. Ubuntu 文件管理器 ranger
  19. 【51单片机Task】:led十六进制控制led灯详解、按键控制流水灯、跑马灯等任务
  20. 支票容错识别系统预处理的设计与实现(转载)

热门文章

  1. 2.3.1操作系统-存储管理:页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则
  2. Unity3d 中 PlayerPrefs 保存数据的总结
  3. 范式球(norm ball),范式锥,欧式球,椭球
  4. 清除IE浏览器SSL缓存
  5. 【附源码】计算机毕业设计SSM面向老年群体的健康养生系统
  6. 通过百度语音生成音频文件
  7. jsp程序设计(一)-jsp入门
  8. apt-get 离线包安装
  9. cas66-71-7|1,10-菲啰啉有机配体/ 1,10-Phen/邻菲啰啉/邻二氮杂菲
  10. 对 oc 学习的 阶段反思