UVA 11853 [dfs乱搞]

Posted 徐暾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA 11853 [dfs乱搞]相关的知识,希望对你有一定的参考价值。

/*
大连热身E题

不要低头,不要放弃,不要气馁,不要慌张

题意:
在1000×1000的格子内有很多个炮弹中心,半径给定。
为某人能否从西部边界出发,从东部边界走出。
不能输出不能,能的话输出最北边的入口和出口的坐标。

思路:
dfs乱搞题。把炮弹辐射范围连在一起的炮弹看作一个整体,记录下它围起来的边界区域。
然后找到最北边的输出。
*/







#include<bits/stdc++.h>
using namespace std;
double x[1005],y[1005],r[1005];
int n;
bool vis[1005];
double mmax=-20000000,mmin1=20000000,mmin2=20000000;
void dfs(int pos){
    mmax=max(mmax,y[pos]+r[pos]);
    if(x[pos]<=r[pos]){
        mmin1=min(mmin1,y[pos]-sqrt(r[pos]*r[pos]-x[pos]*x[pos]));
    }
    if(1000-x[pos]<=r[pos]){
        mmin2=min(mmin2,y[pos]-sqrt(r[pos]*r[pos]-(1000-x[pos])*(1000-x[pos])));
    }
    if(y[pos]<=r[pos])mmin1=mmin2=-1000;
    vis[pos]=1;
    for(int i=0;i<n;i++){
        if(!vis[i]){
            if((x[pos]-x[i])*(x[pos]-x[i])+(y[pos]-y[i])*(y[pos]-y[i])<=(r[i]+r[pos])*(r[i]+r[pos])){
                dfs(i);
            }
        }
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++)scanf("%lf%lf%lf",x+i,y+i,r+i);
        memset(vis,0,sizeof(vis));
        double ans1=1000,ans2=1000;
        for(int i=0;i<n;i++){
            mmax=-20000000;
            mmin1=20000000;
            mmin2=20000000;
            if(!vis[i])dfs(i);
            if(mmax>=1000){
                ans1=min(ans1,mmin1);
                ans2=min(ans2,mmin2);
            }
        }
        if(ans1<=0||ans2<=0)puts("IMPOSSIBLE");
        else printf("0.00 %.2lf 1000.00 %.2lf\n",ans1,ans2);
    }
}

 

以上是关于UVA 11853 [dfs乱搞]的主要内容,如果未能解决你的问题,请参考以下文章

UVA11853-Paintball(对偶图)

HZOJ 20190727 T2 单(树上dp+乱搞?+乱推式子?+dfs?)

Uva10366

UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)

UVa1600 Patrol Robot(dfs)

UVA 11748 - Rigging Elections(dfs)