描述

作为H国的精英特工,你接到了一项任务,驾驶一辆吉普穿越布满监测雷达的禁区。为了简化题目,我们可以把禁区想象为一个左下角是(0, 0)右上角是( WH )的长方形区域。区域中一共有 N 座雷达,其中第 i 座的坐标是(Xi,Yi ),监测范围是半径为 Ri 的圆形区域。所有在圆内和圆上的运载工具都会被监测到。

你的目标是从左到右穿越禁区。你可以选择线段(0, 0)-(0, H)上任意一点作为起点,线段(W, 0)-(WH)上任意一点作为终点。在禁区内你可以沿任意路线行驶,只要保持始终在禁区内并且没有被雷达监测到。

给出禁区内的雷达部署方案,你需要判断是否存在满足条件的行驶路线。

输入

输入包含多组数据。

第1行是一个整数 T,表示以下有 T 组数据 (1 ≤ T ≤ 10)。

每组数据的第1行:三个整数 WHN (0 ≤ WH ≤ 1000000, 1 ≤ N ≤ 1000)。

每组数据的第2-N+1行:每行三个整数XiYiRi (0 ≤ Xi ≤ W, 0 ≤ Yi ≤ H, 1 ≤ Ri ≤ 1000000)。

输出

对于每组数据输出"YES"或者"NO"表示是否有满足条件的行驶路线。

样例输入

2
10 4 2
5 1 1
5 3 1
10 4 2
5 1 1
6 3 1

样例输出

NO
YES
题解: 横向考察,每一条水平线方向,都不能有相交的若干圆覆盖[0,H]。这样才能通过。
方法一: DFS
#include <stdio.h>int graph[1024][1024];
int x[1024], y[1024], r[1024];void build_graph(int N) {int nein[1024] = {0};for (int i = 0; i < N; ++i) {for (int j = i + 1; j < N; ++j) {long long dx = x[i] - x[j], dy = y[i] - y[j], sr = r[i] + r[j];if (dx * dx + dy * dy <= sr * sr) {graph[i][nein[i]] = j;graph[j][nein[j]] = i;nein[i]++;nein[j]++;}}}for (int i = 0; i < N; ++i)graph[i][nein[i]] = -1;
}int dfs(int i, int* done) {done[i] = 1;if (y[i] - r[i] <= 0)return 1;for (int k = 0; graph[i][k] != -1; ++k) {int j = graph[i][k];if (done[j] == 0)if (dfs(j, done))return 1;}return 0;
}int main() {int T, W, H, N;scanf("%d", &T);for (int t = 0; t < T; ++t) {scanf("%d%d%d", &W, &H, &N);for (int i = 0; i < N; ++i)scanf("%d%d%d", &(x[i]), &(y[i]), &(r[i]));build_graph(N);int done[1024] = {};int find = 0;for (int i = 0; i < N; ++i) {if (y[i] + r[i] >= H) {if (dfs(i, done)) {find = 1;printf("NO\n");break;}}}if (find == 0)printf("YES\n");}
}

方法二: 并查集

#include<iostream>
#include<vector>
#include<algorithm>
#include<limits.h>
#include<set>
#include<math.h>
using namespace std;int main()
{vector<pair<int ,int> > vec;int T, W, H, N, xi, yi, ri;cin >> T;while(T--){cin >> W >> H >> N;vector<vector<int> > radars;for(int i = 0; i < N; i++){cin >> xi >> yi >> ri;radars.push_back(vector<int>{xi, yi, ri});}int ans = 1;vector<int> hash(N);for(int i = 0; i < N ;i++) hash[i] = i; for(int i =0; i< N; i++){int x1 = radars[i][0], y1 = radars[i][1], r1 = radars[i][2];for(int j = i+1; j < N; j++){int x2 = radars[j][0], y2 = radars[j][1], r2 = radars[j][2];float dis = sqrt(pow(x1-x2, 2)+ pow(y1-y2, 2));if(dis <= r1+r2){int par1 = hash[j], par2 = hash[i];while(hash[par1] != par1) par1 = hash[par1]; while(hash[par2] != par2) par2 = hash[par2];hash[par1] = par2;}}} set<int> parent;for(int i =0; i< N; i++){int par = hash[i];while(par != hash[par]) par = hash[par];hash[i] = par;parent.insert(par);}for(int val: parent){int top = INT_MIN, bot = INT_MAX;for(int i = 0; i < N; i++){if(hash[i] == val){top = max(top, radars[i][1] + radars[i][2]); bot = min(bot, radars[i][1] - radars[i][2]);if(top >= H && bot <=0){ans = 0;i = N;break;}}    }if(ans == 0) break;}if(ans) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}

[hihoCoder太阁最新面经算法竞赛1] 穿越禁区 (DFS,并查集,计算几何) 难题相关推荐

  1. hihoCoder太阁最新面经算法竞赛18

    比赛链接:http://hihocoder.com/contest/hihointerview27/problems A.Big Plus 模拟水 1 #include <bits/stdc++ ...

  2. 采用Kruskal算法生成最小生成树,并采用并查集的合并优化和查询优化。

    文章目录 最小生成树 1.什么是图的最小生成树(MST)? 2.最小生成树用来解决什么问题? Kruskal(克鲁斯卡尔)算法 算法描述 图解 最小生成树 1.什么是图的最小生成树(MST)? 用N- ...

  3. 经典算法题:字典树、并查集、单调栈、二分、带标记函数dp、树、全排列、字符串问题等常用算法

    0. Tips 1. 位运算 如何枚举一个二进制状态数字k的子集, 方法就是针对中的二进制为1的位开始进行减法,判断数字k的二进制子集, 像枚举(2^k-1) ~ 0一样枚举其子集: int sub ...

  4. 算法导论第21章:并查集

    算法分析的一个约定 MAKE-SET的次数为n MAKE-SET.FIND-SET.UNION的总次数为m 不相交数据集合的链表实现 链表表示一个集合,结点表示一个元素.每个结点都有指向头节点的指针, ...

  5. 基于C语言,详解Kruskal算法(利用并查集)实现构建最小生成树

    目录 一.Kruskal算法的基本介绍 具体做法:找出森林中连接任意两棵树的所有边中,具有最小权值的边,如果将它加入生成树中不产生回路,则它就是生成树中的一条边.这里的关键就是如何判断"将它 ...

  6. Union-Find 并查集算法详解

    Union-Find 并查集算法详解 文章目录 Union-Find 并查集算法详解 一.问题介绍 二.基本思路 三.平衡性优化 四.路径压缩 五.总结 六.例题 一.问题介绍 简单说,动态连通性其实 ...

  7. 光刷题不参加这些算法竞赛?太亏了!

    前言 大家好,我是bigsai.这篇文章给大家介绍算法竞赛,如果有帮助还请一键三连支持一下! 最近有些学妹问我咱们计算机专业的有哪些比赛可以参加呢?我眉头一皱,想了想咱们计算机专业竞赛好像确实蛮多的, ...

  8. 《算法竞赛中的初等数论》(五)正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  9. c语言二分法查找一个数_算法竞赛小专题系列(1):二分法、三分法

    本系列是这本算法教材的扩展资料:<算法竞赛入门到进阶>. 罗勇军.郭卫斌. 清华大学出版社 二分法和三分法是算法竞赛中常见的算法思路,本文介绍了它们的理论背景.模板代码.典型题目. 1. ...

  10. 二分法、三分法 --算法竞赛专题解析(1)

    本系列文章将于2021年整理出版,书名<算法竞赛专题解析>. 前驱教材:<算法竞赛入门到进阶> 清华大学出版社 2019.8 网购:京东 当当      作者签名书 如有建议, ...

最新文章

  1. pandas删除dataframe中行内容全是0的数据行(remove rows with all zeros in dataframe)
  2. 20160406作业
  3. mac 黑窗口连接mysql_Mac下安装配置MySQL
  4. 从单体式架构迁移到微服务架构,妈妈再也不用担心我找工作了!
  5. ArcGIS Server--揭开你的神秘面纱
  6. 黑科技小程序,无需前台登记直接刷脸秒住酒店!
  7. opendds开发指南中文版_最强的开发者技术路线图已经更新到 2020 GitHub 超 118k还有中文...
  8. c++基础学习(10)--(文件、流、异常处理、动态内存、命名空间)
  9. 数组元素的地址计算问题(一维到高维)
  10. ios transporter 缓存_鸿蒙和安卓都是开源,为什么iOS系统却可以获得出色的口碑?...
  11. 微型计算机原理及应用论文,微型计算机原理及应用7030112997-TP19300101.pdf
  12. Unicode - 16 位统一超级字符集
  13. 【伯猫Java教程】网页游戏开发过程——环境搭建
  14. tippy.js_Tippy.js的指令包装
  15. 百度搜索关键词的使用方式
  16. 手机变速齿轮_手机app变速齿轮
  17. 音视频技术开发周刊 | 273
  18. Cesium 添加天地图三维地形
  19. OC中,类的基础知识
  20. 内大教务系统教学评估

热门文章

  1. ftp上传下载工具,6款最值得推荐的Windows端ftp上传下载工具
  2. AutoCAD2020安装教程
  3. 代写品牌故事怎么写才能打动消费者
  4. win7 安装 python3.8.10
  5. B. Shashlik Cooking
  6. 套件端口 群晖_群晖NAS的各种端口
  7. 编译原理——词法分析程序
  8. Linux 命令 大结
  9. 教您用公式编辑器打恒不等于符号
  10. 安卓系统 国内谷歌服务器,在国内使用搭载安卓原生态系统谷歌手机,会是一种什么体验?...