有一个1000 * 1000的战场,战场西南角的坐标为(0,0) 西北角的坐标为(0,1000)。战场有n的敌人,第i个敌人的坐标为(xi,yi) 攻击范围为ri.为了避开敌人的攻击,在任意时刻,你与每个敌人的距离都必须严格大于等于它的攻击范围。你的任务是从战场的西边(x=0 y尽量北,即尽量大进入) 从战场的东边,类似进入的出。
要点:
- 从上到下bfs一下 查看是否连通到底,如果连通到底,那就impossible
- 为什么是选取连接左右的圆的靠南边的交点作为进出的值呢,因为是从上到下遍历的,如果走到某个圆与左右边界有交点,意味着这个圆与左右边界的交点的上方是封闭的区域。是无法走的。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
bool vis[maxn];
struct Circle {
double x, y, r;
friend istream& operator >> (istream &in, Circle &c) {
in >> c.x >> c.y >> c.r;
return in;
}
bool isTopConnect() {
return y + r >= 1000 ;
}
bool isConnect(Circle &c) {
return hypot(x - c.x, y - c.y)