UVA - 11853 Paintball(dfs)

UVA - 11853

思路:dfs,从最上面超过上边界的圆开始搜索,看能不能搜到最下面超过下边界的圆。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
double l,r;
int n;
bool vis[N]={false};
bool flag=false;
struct point 
{
    int x,y,r;
}a[N];
bool intersect(point a,point b)
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)<=(a.r+b.r)*(a.r+b.r); 
}
void dfs(point u)
{
    if(u.x<u.r||u.x+u.r>1000)
    {
        l=min(l,u.y-sqrt(u.r*u.r-u.x*u.x));
        r=min(r,u.y-sqrt(u.r*u.r-(1000-u.x)*(1000-u.x)));
    }
    if(u.y<u.r)
    {
        flag=true;
        return ;
    }
    for(int i=0;i<n;i++)
    {
        if(!vis[i]&&intersect(u,a[i]))
        {
            vis[i]=true;
            dfs(a[i]);
        }
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        memset(vis,false,sizeof(vis));
        flag=false;
        l=1000,r=1000;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].r);
        }
        for(int i=0;i<n;i++)
        {
            if(!vis[i]&&a[i].y+a[i].r>1000)
            {
                vis[i]=true;    
                dfs(a[i]);
            }
        }
        if(flag)printf("IMPOSSIBLE\n");
        else printf("0.00 %.2lf 1000.00 %.2lf\n",l,r);
    }
    return 0;
}

 

posted @ 2017-08-03 15:49  Wisdom+.+  阅读(189)  评论(0编辑  收藏  举报