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 ...
随机推荐
- erlang ets表
一.表遍历 通过ets:first/1获取表的第一个关键字,表中下一个关键字用ets:next/2得到,直到ets:next/2返回'$end_of_table' 当多几个进程并发访问ets表时,可以 ...
- 安装mcrouter
下载准备: mcrouter 下载地址 : https://github.com/facebook/mcrouter gflags 下载地址:http://download.csdn.net/deta ...
- <meta http-equiv="X-UA-Compatible" content="IE=Edge">
1.X-UA-Compatible X-UA-Compatible是IE8的一个专有<meta>属性,它告诉IE8采用何种IE版本去渲染网页,在html的<head>标签中使用 ...
- insertAdjacentHTML方法详解
添加HTML内容与文本内容以前用的是innerHTML与innerText方法, 最近发现还有insertAdjacentHTML和 insertAdjacentText方法, 这两个方法更灵活,可以 ...
- Ztree手风琴效果(第三版)
第一版:点击一级目录展开,再点击时不能收回 第二版:点击一级目录展开,再点击时可以收回 第三版:优化样式,修复主菜单下的子菜单下级无子节点时点击无反应问题(js报错) <%@ page lang ...
- HDU 4585 Shaolin (set的应用)
set是STL中非常方便的工具,可以实现自动去重和排序,可我一直忽视它的重要性,导致吃了好几次亏. 在思考这道题的时候,我一直往二分上靠拢,可是二分需要直接插入排序,直接插入排序覆盖的时候复杂度最大是 ...
- jni开发中的常见错误
* java.lang.UnsatisfiedLinkError: Native method not found: 本地方法没有找到 * 本地函数名写错 * 忘记加载.so文件 没有调用System ...
- 安卓OpenGL入门
1.先用一个GLSurfaceView作为画布,然后自定义一个Renderer继承自Renderer,把这个自定义的Renderer通过setRenderer()设置给GLSurfaceView就可以 ...
- asp.net 基础
前台HTML,javascript,后台C# 代码能不在后台写,就不在后台写 WebSite和WebApplication的区别 1)当改变后台代码时,WebApplication需重启浏览器或者重新 ...
- hibernate ——联合主键
接上一篇博客:http://www.cnblogs.com/tengpan-cn/p/5551323.html 主键类不需要写任何注解,表对象类使用@IdClass注解 在表对象类前面加@IdClas ...