UVa11853 - Paintball

来源:互联网 发布:巨人网络借壳上市过程 编辑:程序博客网 时间:2024/05/19 13:26
#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;}

0 1
原创粉丝点击