UVA 11853 Paintball ——(dfs+圆交判定)
题意:给出一个1000*1000大小的矩阵,里面有若干圆,表示障碍物,现在要找出从左边到右边的一条通路,输出入口和出口的坐标,如果有多答案,输出y值最大的答案。
分析:从与上面相连的圆开始dfs,每次找与之相交的圆作为dfs的路径,如果能访问到下面,那么左边和右边肯定是不连通的;否则,连通。并且在dfs的时候更新y值最大的答案。
具体见代码:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <set>
#include <math.h>
using namespace std;
const int N = + ;
const int inf = 2e9;
typedef long long ll;
typedef pair<int,int> pii; int n;
int vis[N];
struct circle
{
int x,y,r;
void read()
{
scanf("%d%d%d",&x,&y,&r);
}
}c[N]; bool can(circle a,circle b)
{
double dx = a.x - b.x;
double dy = a.y - b.y;
double d = sqrt(dx*dx+dy*dy);
return d <= a.r + b.r;
} double ansL = , ansR = ;
void update(int u)
{
if(c[u].x <= c[u].r)
{
double t = sqrt(c[u].r*c[u].r - c[u].x*c[u].x);
double pos = c[u].y - t;
ansL = min(ansL, pos);
}
if(c[u].x + c[u].r >= )
{
double tt = 1000.0 - c[u].x;
double t = sqrt(c[u].r*c[u].r - tt*tt);
double pos = c[u].y - t;
ansR = min(ansR, pos);
}
} bool dfs(int u)
{
vis[u] = ;
if(c[u].y <= c[u].r) return false;
update(u);
for(int i=;i<=n;i++)
{
if(!vis[i] && can(c[u], c[i]))
{
if(!dfs(i)) return false;
}
}
return true;
} void solve()
{
ansL = , ansR = ;
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++)
{
if(!vis[i] && c[i].y + c[i].r >= )
{
if(!dfs(i))
{
puts("IMPOSSIBLE");
return ;
}
}
}
printf("0.00 %.2f 1000.00 %.2f\n",ansL,ansR);
} int main()
{
while(scanf("%d",&n) == )
{
for(int i=;i<=n;i++) c[i].read();
solve();
}
return ;
}
UVA 11853 Paintball ——(dfs+圆交判定)的更多相关文章
- UVA - 11853 Paintball(dfs)
UVA - 11853 思路:dfs,从最上面超过上边界的圆开始搜索,看能不能搜到最下面超过下边界的圆. 代码: #include<bits/stdc++.h> using namespa ...
- UVA 11853 - Paintball 战场(dfs)
题意:有n个敌人,每个敌人有一个攻击范围,问你是否存在从西边到东边的路径,如果存在,输出入点和出点最靠北的坐标. 把每个敌人看出一个圆,从上往下跑dfs连通,如果到达底部,那么无解.要求出最靠北的坐标 ...
- UVA 11853 Paintball(几何数学+DFS)
https://vjudge.net/problem/UVA-11853 根据题意描述,相当于在一个正方形中有若干个圆形障碍物,问是否能从左边界走到右边界.判断是否有解需要一点创造性的思维:不妨把正方 ...
- Uva - 11853 - Paintball
先判断是否有解,从上到下dfs判断连通性,如果有从顶部到底部连通图,则无解.再判断最北的进出位置,从上边界开始遍历,沿途检查与边界相交的圆.这些圆的左边界的交点中最靠南边的一个就是所有的最北进入位置, ...
- CF 337D 求圆交
题目链接:http://codeforces.com/problemset/problem/337/D 题意:就是一棵树上,有一些点被来自东方的神秘力量影响的,力量影响范围是d,为可能的力量源有几个. ...
- 计算几何(容斥原理,圆交):HDU 5120 Intersection
Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The followin ...
- HDU 3264 Open-air shopping malls ——(二分+圆交)
纯粹是为了改进牛吃草里的两圆交模板= =. 代码如下: #include <stdio.h> #include <algorithm> #include <string. ...
- Intersection(HDU5120 + 圆交面积)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5120 题目: 题意: 求两个圆环相交的面积. 思路: 两个大圆面积交-2×大圆与小圆面积交+两小圆面 ...
- HDU 3467 Song of the Siren(圆交)
Problem Description In the unimaginable popular DotA game, a hero Naga Siren, also known as Slithice ...
随机推荐
- 27.编写一个Animal类,具有属性:种类;具有功能:吃、睡。定义其子类Fish 和Dog,定义主类E,在其main方法中分别创建其对象并测试对象的特性。
///Animal类 package d922A; public class Animal { private String kind; public String getKind() { Syste ...
- EF Unit Of Work
BaseEntity, 所有的业务表都继承这个类,每个表的主键都是GUID, 主键名Id. public abstract class BaseEntity{ public BaseEntity() ...
- CSSd的优先级别
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- yii2图片验证码
控制器LoginController.php <?php namespace backend\controllers; use Yii; use yii\debug\models\search\ ...
- Thrift源码解析--TBinaryProtocol
本文为原创,未经许可禁止转载. 关于Tprotocol层都是一些通信协议,个人感觉内容较大,很难分类描述清楚.故打算以TBinaryProtocol为例,分析客户端发请求以及接收服务端返回数据的整个过 ...
- javascript 深入浅出 (未完成4-17)
慕课网javascript总结 课程地址 课程大纲: 一.数据类型 二.表达式和运算符 三.语句 四.对象 五.数组 六.函数 七.this 八.闭包和作用域 九.OOP 十.正则与模式匹配 ---- ...
- Strusts2--课程笔记5
数据验证: 输入验证分为客户端验证与服务器端验证.客户端验证主要通过JavaScript脚本进行,而服务器端验证主要是通过Java代码进行验证. 分为以下四种情况: (1)手工编写代码,对所有Ac ...
- Spring的Bean,AOP以及工具类初探
1.Bean(Ioc) BeanWrapper 根据JavaDoc中的说明,BeanWrapper提供了设置和获取属性值(单个的或者是批量的),获取属性描述信息.查询只读或者可写属性等功能.不仅如此, ...
- shape的使用
android在布局边缘位置处理圆角的两个办法: 1),一个是直接让美工切一张带有圆角的图片. 2),使用shape来解决. 第一种不在赘述,主要讲一下第二中方法来实现. 上边缘出现圆角,下边缘正常的 ...
- 笔记整理--Linux守护进程
Linux多进程开发(三)进程创建之守护进程的学习 - _Liang_Happy_Life__Dream - 51CTO技术博客 - Google Chrome (2013/10/11 16:48:2 ...