#include<queue>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1000+10;
const double w=1000;
struct Ball
{
double x,y,r;
Ball(double x=0,double y=0,double r=0):x(x),y(y),r(r){}
}ball[maxn];
double lft,rht;
int n;
bool vis[maxn];
bool intersect(int a,int b)
{
return ball[a].r+ball[b].r>=sqrt((ball[b].x-ball[a].x)*(ball[b].x-ball[a].x)+(ball[b].y-ball[a].y)*(ball[b].y-ball[a].y));
}
void check_cycle(int u)
{
if(ball[u].x-ball[u].r<0)
{
lft=min(lft,ball[u].y-sqrt(ball[u].r*ball[u].r-ball[u].x*ball[u].x));
}
if(ball[u].x+ball[u].r>w)
{
rht=min(rht,ball[u].y-sqrt(ball[u].r*ball[u].r-(w-ball[u].x)*(w-ball[u].x)));
}
}
bool dfs(int u)
{
if(vis[u]) return false;
vis[u]=true;
if(ball[u].y-ball[u].r<0) return true;
for(int i=0;i<n;i++)
{
if(intersect(i,u)&&dfs(i)) return true;
}
check_cycle(u);
return false;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%lf%lf%lf",&ball[i].x,&ball[i].y,&ball[i].r);
}
lft=rht=w;
bool flag=false;
memset(vis,false,sizeof(vis));
for(int i=0;i<n;i++)
{
if(ball[i].y+ball[i].r>=w&&dfs(i))
{
flag=true;break;
}
}
if(flag) printf("IMPOSSIBLE\n");
else printf("0.00 %.2f 1000.00 %.2f\n",lft,rht);
}
return 0;
}
UVa 11853 - Paintball
最新推荐文章于 2019-02-26 08:16:27 发布