[hihoCoder太阁最新面经算法竞赛1] 穿越禁区 (DFS,并查集,计算几何) 难题
来源:互联网 发布:电路设计软件protel 编辑:程序博客网 时间:2024/04/29 01:32
描述
作为H国的精英特工,你接到了一项任务,驾驶一辆吉普穿越布满监测雷达的禁区。为了简化题目,我们可以把禁区想象为一个左下角是(0, 0)右上角是( W, H )的长方形区域。区域中一共有 N 座雷达,其中第 i 座的坐标是(Xi,Yi ),监测范围是半径为 Ri 的圆形区域。所有在圆内和圆上的运载工具都会被监测到。
你的目标是从左到右穿越禁区。你可以选择线段(0, 0)-(0, H)上任意一点作为起点,线段(W, 0)-(W, H)上任意一点作为终点。在禁区内你可以沿任意路线行驶,只要保持始终在禁区内并且没有被雷达监测到。
给出禁区内的雷达部署方案,你需要判断是否存在满足条件的行驶路线。
输入
输入包含多组数据。
第1行是一个整数 T,表示以下有 T 组数据 (1 ≤ T ≤ 10)。
每组数据的第1行:三个整数 W, H, N (0 ≤ W, H ≤ 1000000, 1 ≤ N ≤ 1000)。
每组数据的第2-N+1行:每行三个整数Xi, Yi, Ri (0 ≤ Xi ≤ W, 0 ≤ Yi ≤ H, 1 ≤ Ri ≤ 1000000)。
输出
对于每组数据输出"YES"或者"NO"表示是否有满足条件的行驶路线。
样例输入 210 4 25 1 15 3 110 4 25 1 16 3 1
样例输出 NOYES
描述
作为H国的精英特工,你接到了一项任务,驾驶一辆吉普穿越布满监测雷达的禁区。为了简化题目,我们可以把禁区想象为一个左下角是(0, 0)右上角是( W, H )的长方形区域。区域中一共有 N 座雷达,其中第 i 座的坐标是(Xi,Yi ),监测范围是半径为 Ri 的圆形区域。所有在圆内和圆上的运载工具都会被监测到。
你的目标是从左到右穿越禁区。你可以选择线段(0, 0)-(0, H)上任意一点作为起点,线段(W, 0)-(W, H)上任意一点作为终点。在禁区内你可以沿任意路线行驶,只要保持始终在禁区内并且没有被雷达监测到。
给出禁区内的雷达部署方案,你需要判断是否存在满足条件的行驶路线。
输入
输入包含多组数据。
第1行是一个整数 T,表示以下有 T 组数据 (1 ≤ T ≤ 10)。
每组数据的第1行:三个整数 W, H, N (0 ≤ W, H ≤ 1000000, 1 ≤ N ≤ 1000)。
每组数据的第2-N+1行:每行三个整数Xi, Yi, Ri (0 ≤ Xi ≤ W, 0 ≤ Yi ≤ H, 1 ≤ Ri ≤ 1000000)。
输出
对于每组数据输出"YES"或者"NO"表示是否有满足条件的行驶路线。
210 4 25 1 15 3 110 4 25 1 16 3 1
NOYES
题解: 横向考察,每一条水平线方向,都不能有相交的若干圆覆盖[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;}
0 0
- [hihoCoder太阁最新面经算法竞赛1] 穿越禁区 (DFS,并查集,计算几何) 难题
- hihoCoder太阁最新面经算法竞赛题解(1)
- [hihoCoder太阁最新面经算法竞赛2] 岛屿 (DFS,Hash Function)
- hihoCoder太阁最新面经算法竞赛题解(2)
- hihoCoder太阁最新面经算法竞赛题解(3)
- hihoCoder太阁最新面经算法竞赛题解(4)
- hihoCoder太阁最新面经算法竞赛题解(5)
- hihoCoder太阁最新面经算法竞赛题解(6)
- hihoCoder太阁最新面经算法竞赛题解(7)
- hihoCoder— 穿越禁区(并查集)
- 《hihoCoder太阁最新面经算法竞赛4》题目解析【含源代码】
- [hihoCoder 太阁最新面经算法竞赛6] 数组重排(N个数的最小公倍数)
- hihoCoder太阁最新面经算法竞赛8 A Game(区间DP)
- hihoCoder太阁最新面经算法竞赛8 题目2 : Dice Possibility (概率DP)
- [hihocoder]太阁最新面经算法竞赛8]A.A Game
- [hihoCoder太阁最新面经算法竞赛8]B.Dice Possibility
- [hihoCoder太阁最新面经算法竞赛9] 题目一:Browser Caching (LRU缓存)
- [hihoCoder太阁最新面经算法竞赛8]题目2 : Dice Possibility(简单记忆化搜索)
- Facebook App 优化工具 ReDex 优化的 6 点及未优化的一大方面
- memcached介绍
- android面试题总结加强再加强版(二)
- 如果改变placeholder的颜色和字体大小
- 动态规划:从新手到专家(关于动态规划算法最精彩的中文描述,没有之一)
- [hihoCoder太阁最新面经算法竞赛1] 穿越禁区 (DFS,并查集,计算几何) 难题
- 第四范式
- linux kernel debug 之 CallTrace
- 产品经理的思维误区和设计流程
- Android Studio改变应用图标
- 程序员一定要投资的那些事
- CSS元素隐藏“失效”以其妙用
- APK瘦身实践
- TCP/IP简介