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

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <string>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <stack>
#include <queue>
#include <bitset>
#include <cassert>
#include <cmath>

using namespace std;

const int maxn = 1005;
const double W = 1000.0;

int n, vis[maxn];
double x[maxn], y[maxn], r[maxn], leftP, rightP;
bool flag;

// 判断c1和c2是否相交
bool intersect(int c1, int c2)
{
	return sqrt((x[c1] - x[c2]) * (x[c1] - x[c2]) + (y[c1] - y[c2]) * (y[c1] - y[c2])) < r[c1] + r[c2];
}

void checkCircle(int u)
{
	if (x[u] - r[u] < 0) {
		leftP = min(leftP, y[u] - sqrt(r[u] * r[u] - x[u] * x[u]));
	}
	if (x[u] + r[u] > W) {
		rightP = min(rightP, y[u] - sqrt(r[u] * r[u] - (W - x[u]) * (W - x[u])));
	}
}

// 能不能到达底部
bool dfs(int u)
{
	if (vis[u]) {
		return false;
	}
	vis[u] = 1;
	if (y[u] - r[u] < 0) {
		return true;
	}
	for (int v = 0; v < n; v++) {
		if (intersect(u, v) && dfs(v)) {
			return true;
		}
	}
	checkCircle(u);
	return false;
}

int main()
{
	while (scanf("%d", &n) == 1) {
		flag = true;
		leftP = rightP = W;
		memset(vis, 0, sizeof(vis));
		for (int i = 0; i < n; i++) {
			scanf("%lf%lf%lf", &x[i], &y[i], &r[i]);
		}
		for (int i = 0; i < n; i++) {
			if (y[i] + r[i] >= W && dfs(i)) { // 从上面开始dfs
				flag = false;
				break;
			}
		}
		if (flag) {
			printf("0.00 %.2lf %.2lf %.2lf\n", leftP, W, rightP);
		}
		else {
			printf("IMPOSSIBLE\n");
		}
	}

	return 0;
}

Uva - 11853 - Paintball的更多相关文章

  1. UVA - 11853 Paintball(dfs)

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

  2. UVA 11853 Paintball ——(dfs+圆交判定)

    题意:给出一个1000*1000大小的矩阵,里面有若干圆,表示障碍物,现在要找出从左边到右边的一条通路,输出入口和出口的坐标,如果有多答案,输出y值最大的答案. 分析:从与上面相连的圆开始dfs,每次 ...

  3. UVA 11853 - Paintball 战场(dfs)

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

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

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

  5. UVA 11853 [dfs乱搞]

    /* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...

  6. 逆向思维 UVA 11853

    题目大意:紫书175 思路:看书...2333 关键点就是利用已知条件来逆向思考是否能走通,而不是傻傻的从某个点开始出发啊啥的.

  7. Chapter 5. Graph Theory:: Fundamentals:: Intermediate

    10457 - Magic Car 题意一开始看起来有点费解,其实最后就是要起点到终点的路径上最大边与最小边之差越小越好.这样我们可以先将边排个序,然后枚举路径上的最小边,之后依次将比它大的边按升序的 ...

  8. uva 12083 Guardian of Decency (二分图匹配)

    uva 12083 Guardian of Decency Description Frank N. Stein is a very conservative high-school teacher. ...

  9. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

随机推荐

  1. ubuntu14.04+sublime3+latex配置

    目的:用题目所说的三个东西写论文. 配置方法:参考 http://blog.csdn.net/bleedingfight/article/details/72810606, 但该博客所提的texliv ...

  2. 开源Spring解决方案--lm.solution

    Github 项目地址: https://github.com/liumeng0403/lm.solution 一.说明 1.本项目未按java项目传统命名方式命名项目名,包名 如:org.xxxx. ...

  3. electron应用以管理员权限启动

    最近在用electron开发PC桌面应用,其中有个需求就是整个应用以管理员权限启动.很头痛,各种google,baidu. 最后终于解决了,可以分为三个步骤,做个总结分享. 一.如果没有manifes ...

  4. OpenSuSE Linux下安装Oracle10g的步骤

    OpenSuSE Linux下安装Oracle10g的步骤: --root用户 --1.vi etc/profile 添加脚本: if [ \$USER = "oracle" ]; ...

  5. Java中使用long类型实现精确的四则运算

    引子 Effective Java 2nd Edition 第48条建议:如果需要精确的答案,请避免使用float和doble.float和double类型主要是为了科学计算和工程计算而设计的.他们执 ...

  6. Zookeeper的安装部署

    1.Zookeeper的安装部署 7.1 Zookeeper工作机制 7.1.1.Zookeeper集群角色 Zookeeper集群的角色:  Leader 和  follower (Observer ...

  7. RDO Stack:VMs cannot access external network.

    Issue: There are many root causes to make your openstack vm instances cannot be reached from externa ...

  8. RDO Stack Exception: UnboundLocalError: local variable 'logFile' referenced before assignment

    Issue: When you install RDO stack on CentOS, you may encounter following error. Error: [root@localho ...

  9. Dynamics CRM2016 关闭错误报告弹框提示

    在之前的版本中错误报告的弹框提示是可以在隐私首选项中设置关闭的,如下图所示 但是在2016中这个设置没了 有人说在右上角的选项中设置,但那个只能是设置个人的无法修改系统级别的.在系统中找了半天还是没有 ...

  10. Android 5.0 调色 Palette调色功能

    Palette非常好用,也非常好玩. Palette的作用是从图像中提取突出的颜色,这样我们可以根据提取到的色值把它赋给Toolbar,标题,状态栏等,可以使我们的整个界面色调统一,效果非常好看. P ...