UVA 11853 Paintball(几何数学+DFS)
https://vjudge.net/problem/UVA-11853
根据题意描述,相当于在一个正方形中有若干个圆形障碍物,问是否能从左边界走到右边界。判断是否有解需要一点创造性的思维:不妨把正方形当做一个湖,所有的圆形都是垫脚石,假设我们可以从上边界“踩着”垫脚石成功走到下边界,说明左右边界是不连通的;否则就是连通的。想到了这里,便不难用dfs或bfs来判断是否有解了:每次都从和上边界相交的圆开始进行dfs,如果遇到某个圆和下边界也相交,那么无解。
这样解的存在性只需要一次DFS或者BFS判连通即可。如何求出最北的进/出位置呢?方法如下:从上边界开始遍历,沿途检查与边界相交的圆。这些圆和左边界的交点中最靠南边的一个就是所求的最北进入位置,和右边界的最南交点就是所求的最北离开位置。
1 #define _CRT_SECURE_NO_WARNINGS
2 #include<iostream>
3 #include<algorithm>
4 #include<string>
5 #include<sstream>
6 #include<set>
7 #include<vector>
8 #include<stack>
9 #include<map>
10 #include<queue>
11 #include<deque>
12 #include<cstdlib>
13 #include<cstdio>
14 #include<cstring>
15 #include<cmath>
16 #include<ctime>
17 #include<functional>
18 using namespace std;
19
20 #define N 1000+10
21 struct Circle
22 {
23 int x, y, r;
24 void read()
25 {
26 scanf("%d%d%d", &x, &y, &r);
27 }
28 }c[N];
29 double ans1, ans2;
30 int n, vis[N];
31
32 bool can(Circle a, Circle b)//判断两个圆是否相交或相切
33 {
34 int dx = a.x - b.x;
35 int dy = a.y - b.y;
36 return dx*dx + dy*dy - (a.r + b.r)*(a.r + b.r) <= 0;
37 }
38 bool dfs(int u)
39 {
40 vis[u] = 1;
41 if (c[u].y - c[u].r <= 0)return false;//圆和下边界有交点,说明不存在解,直接退出
42 if (c[u].x - c[u].r <= 0)ans1 = min(ans1, c[u].y - sqrt(c[u].r*c[u].r - c[u].x*c[u].x));//与左边界有交点,取纵坐标的较小者
43 if (1000 - c[u].x - c[u].r <= 0)ans2 = min(ans2, c[u].y - sqrt(c[u].r*c[u].r - (1000 - c[u].x)*(1000 - c[u].x)));//与右边界有交点,取纵坐标较小者
44 for (int i = 0; i < n; i++)
45 if (!vis[i])
46 {
47 if (can(c[u], c[i]))//路径可以继续扩展
48 if (!dfs(i))return false;
49 }
50 return true;
51 }
52 void solve()
53 {
54 ans1 = ans2 = 1000;
55 for (int i = 0; i < n; i++)
56 if (!vis[i] && c[i].y + c[i].r>=1000)//从与上边界有交点的圆出发
57 {
58 if (!dfs(i))//不存在解,如果存在解那么每次dfs后都会更新解
59 {
60 puts("IMPOSSIBLE");
61 return;
62 }
63 }
64 printf("0.00 %.2lf 1000.00 %.2lf\n", ans1, ans2);
65 }
66 int main()
67 {
68 //freopen("t.txt", "r", stdin);
69 while (~scanf("%d", &n))
70 {
71 memset(vis, 0, sizeof(vis));
72 for (int i = 0; i < n; i++)
73 c[i].read();//利用成员函数方便读入数据
74 solve();
75 }
76 return 0;
77 }
UVA 11853 Paintball(几何数学+DFS)的更多相关文章
- UVA - 11853 Paintball(dfs)
UVA - 11853 思路:dfs,从最上面超过上边界的圆开始搜索,看能不能搜到最下面超过下边界的圆. 代码: #include<bits/stdc++.h> using namespa ...
- UVA 11853 Paintball ——(dfs+圆交判定)
题意:给出一个1000*1000大小的矩阵,里面有若干圆,表示障碍物,现在要找出从左边到右边的一条通路,输出入口和出口的坐标,如果有多答案,输出y值最大的答案. 分析:从与上面相连的圆开始dfs,每次 ...
- UVA 11853 - Paintball 战场(dfs)
题意:有n个敌人,每个敌人有一个攻击范围,问你是否存在从西边到东边的路径,如果存在,输出入点和出点最靠北的坐标. 把每个敌人看出一个圆,从上往下跑dfs连通,如果到达底部,那么无解.要求出最靠北的坐标 ...
- Uva - 11853 - Paintball
先判断是否有解,从上到下dfs判断连通性,如果有从顶部到底部连通图,则无解.再判断最北的进出位置,从上边界开始遍历,沿途检查与边界相交的圆.这些圆的左边界的交点中最靠南边的一个就是所有的最北进入位置, ...
- UVA.297 Quadtrees (四分树 DFS)
UVA.297 Quadtrees (四分树 DFS) 题意分析 将一个正方形像素分成4个小的正方形,接着根据字符序列来判断是否继续分成小的正方形表示像素块.字符表示规则是: p表示这个像素块继续分解 ...
- B. Tell Your World(几何数学 + 思维)
B. Tell Your World time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)
UVA 572 -- Oil Deposits(DFS求连通块) 图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块. 下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常 ...
- C. Polygon for the Angle 几何数学
C. Polygon for the Angle 几何数学 题意 给出一个度数 ,问可以实现的最小的n的n边形是多少 思路 由n边形的外角和是180度直接就可以算出最小的角是多少 如果给出的度数是其最 ...
- uva :10123 - No Tipping(dfs + 几何力矩 )
option=com_onlinejudge&Itemid=8&page=show_problem&category=109&problem=1064&mosm ...
随机推荐
- Linux下MySQL多实例部署记录
什么是MySQL多实例 简单地说,Mysql多实例就是在一台服务器上同时开启多个不同的服务端口(3306.3307),同时运行多个Mysql服务进程,这些服务进程通过不同的socket监听不同的服务端 ...
- system V信号量和Posix信号量
一.函数上的区别 信号量有两种实现:传统的System V信号量和新的POSIX信号量.它们所提供的函数很容易被区分:对于所有System V信号量函数,在它们的名字里面没有下划线.例如,应该是sem ...
- 清理docker常用命令
0.查看docker占用空间docker system df1.一键删除所有已经停止的容器 docker container prune 2.删除所有容器(包含停止的 正在运行的) docker rm ...
- Java-Collection、Map和Array之间的转换
1 List -> Map 设个User类: public class User { private String userName; private String userId; privat ...
- DVWA靶场之CSRF(跨站请求伪造)通关
Low: 服务器就看了password_new与password_conf是否相同,没有其他的验证 重新构造一个html页面,(自己假装自己是受害者,ip是靶场ip非本地ip) 1 <img s ...
- web API 的异常处理
实现自定义的异常处理类 --------------------------------------------------------------------- public class MyExc ...
- .Net 生成带注释的Nuget包
使用.NET Core时,我们的类库都要打包成nuget包上传到nuget服务器,以供自己或他人使用 .Net sdk提供了一个 .Net pack 命令可以生成nuget包.比如下面的命令 dotn ...
- qt 中回调函数的实现
在QT中回调函数主要可以实现多态性,通过回调函数可以动态处理一些操作.在多线程中,当同时需要处理多个事务的时候,显然你会去创建多个线程类然后实例化,这显然会增加开发工作,当我们在线程类中加入一个回调函 ...
- 关于 go-fastdfs-web 的SpringBoot 后台管理
1.问题的产生: 1.公司需要存储图片数据,采用Go语言的fastdfs,实现存储,我的职责就是部署,SpringBoot版本的管理平台. 2.当我看见代码之后我的内心是拒绝的,没有注释....... ...
- CompletionService简介、原理以及小案例
博客1:http://www.oschina.net/question/12_11255 博客2: CompletionService简介 CompletionService与ExecutorServ ...