题意:给出一个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+圆交判定)的更多相关文章

  1. UVA - 11853 Paintball(dfs)

    UVA - 11853 思路:dfs,从最上面超过上边界的圆开始搜索,看能不能搜到最下面超过下边界的圆. 代码: #include<bits/stdc++.h> using namespa ...

  2. UVA 11853 - Paintball 战场(dfs)

    题意:有n个敌人,每个敌人有一个攻击范围,问你是否存在从西边到东边的路径,如果存在,输出入点和出点最靠北的坐标. 把每个敌人看出一个圆,从上往下跑dfs连通,如果到达底部,那么无解.要求出最靠北的坐标 ...

  3. UVA 11853 Paintball(几何数学+DFS)

    https://vjudge.net/problem/UVA-11853 根据题意描述,相当于在一个正方形中有若干个圆形障碍物,问是否能从左边界走到右边界.判断是否有解需要一点创造性的思维:不妨把正方 ...

  4. Uva - 11853 - Paintball

    先判断是否有解,从上到下dfs判断连通性,如果有从顶部到底部连通图,则无解.再判断最北的进出位置,从上边界开始遍历,沿途检查与边界相交的圆.这些圆的左边界的交点中最靠南边的一个就是所有的最北进入位置, ...

  5. CF 337D 求圆交

    题目链接:http://codeforces.com/problemset/problem/337/D 题意:就是一棵树上,有一些点被来自东方的神秘力量影响的,力量影响范围是d,为可能的力量源有几个. ...

  6. 计算几何(容斥原理,圆交):HDU 5120 Intersection

    Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The followin ...

  7. HDU 3264 Open-air shopping malls ——(二分+圆交)

    纯粹是为了改进牛吃草里的两圆交模板= =. 代码如下: #include <stdio.h> #include <algorithm> #include <string. ...

  8. Intersection(HDU5120 + 圆交面积)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5120 题目: 题意: 求两个圆环相交的面积. 思路: 两个大圆面积交-2×大圆与小圆面积交+两小圆面 ...

  9. HDU 3467 Song of the Siren(圆交)

    Problem Description In the unimaginable popular DotA game, a hero Naga Siren, also known as Slithice ...

随机推荐

  1. 27.编写一个Animal类,具有属性:种类;具有功能:吃、睡。定义其子类Fish 和Dog,定义主类E,在其main方法中分别创建其对象并测试对象的特性。

    ///Animal类 package d922A; public class Animal { private String kind; public String getKind() { Syste ...

  2. EF Unit Of Work

    BaseEntity, 所有的业务表都继承这个类,每个表的主键都是GUID, 主键名Id. public abstract class BaseEntity{ public BaseEntity() ...

  3. CSSd的优先级别

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. yii2图片验证码

    控制器LoginController.php <?php namespace backend\controllers; use Yii; use yii\debug\models\search\ ...

  5. Thrift源码解析--TBinaryProtocol

    本文为原创,未经许可禁止转载. 关于Tprotocol层都是一些通信协议,个人感觉内容较大,很难分类描述清楚.故打算以TBinaryProtocol为例,分析客户端发请求以及接收服务端返回数据的整个过 ...

  6. javascript 深入浅出 (未完成4-17)

    慕课网javascript总结 课程地址 课程大纲: 一.数据类型 二.表达式和运算符 三.语句 四.对象 五.数组 六.函数 七.this 八.闭包和作用域 九.OOP 十.正则与模式匹配 ---- ...

  7. Strusts2--课程笔记5

      数据验证: 输入验证分为客户端验证与服务器端验证.客户端验证主要通过JavaScript脚本进行,而服务器端验证主要是通过Java代码进行验证. 分为以下四种情况: (1)手工编写代码,对所有Ac ...

  8. Spring的Bean,AOP以及工具类初探

    1.Bean(Ioc) BeanWrapper 根据JavaDoc中的说明,BeanWrapper提供了设置和获取属性值(单个的或者是批量的),获取属性描述信息.查询只读或者可写属性等功能.不仅如此, ...

  9. shape的使用

    android在布局边缘位置处理圆角的两个办法: 1),一个是直接让美工切一张带有圆角的图片. 2),使用shape来解决. 第一种不在赘述,主要讲一下第二中方法来实现. 上边缘出现圆角,下边缘正常的 ...

  10. 笔记整理--Linux守护进程

    Linux多进程开发(三)进程创建之守护进程的学习 - _Liang_Happy_Life__Dream - 51CTO技术博客 - Google Chrome (2013/10/11 16:48:2 ...