题目链接
好题。
利用DFS递归与上界连接的圆,返回bool类型的DFS判断是否联通下界(u.y-u.r<0),然后更新in,out值,采用此联通块的与左右边界交点最南位置。
C++代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000+10;
struct dot{
double x,y,r;
}all[1024];
double in,out;
int n,vist[maxn],ok;
bool dfs(int u){
if(vist[u]) return false;
vist[u]=1;
if(all[u].y<=all[u].r) return true;
for(int v=0;v<n;v++)
if(hypot(all[u].x-all[v].x,all[u].y-all[v].y)<all[u].r+all[v].r&&dfs(v)) return true;
if(all[u].x<all[u].r) in=min(in,all[u].y-sqrt(all[u].r*all[u].r-all[u].x*all[u].x));
if(all[u].x+all[u].r>1000) out=min(out,all[u].y-sqrt(all[u].r*all[u].r-(1000-all[u].x)*(1000-all[u].x)));
return false;
}
int main(){
while(memset(vist,0,sizeof(vist)),ok=1,in=out=1000,cin>>n){
for(int i=0;i<n;i++) cin>>all[i].x>>all[i].y>>all[i].r;
for(int i=0;i<n;i++)
if(all[i].y+all[i].r>=1000&&dfs(i)) {ok=0;break;}
if(ok) printf("0.00 %.2f 1000.00 %.2f\n",in,out);
else printf("IMPOSSIBLE\n");
}
return 0;
}