写作max读作min
#include<iostream>
#include<cstdio>
#include<cmath>
#define m 1001
using namespace std;
int n,father[m];
double x[m],y[m],r[m],lc[m],rc[m],maxl=1000,maxr=1000;
bool up[m],down[m],Left[m],Right[m],vis[m];
double dist(int i,int j){
return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
int find(int x){
if(father[x]!=x)father[x]=find(father[x]);
return father[x];
}
void Union(int x,int y){
int p=find(x),q=find(y);
father[p]=q;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lf%lf%lf",&x[i],&y[i],&r[i]);
father[i]=i;
for(int j=1;j<=i-1;j++)
if(dist(i,j)<=r[i]+r[j]&&father[i]!=father[j])
Union(i,j);
if(y[i]<r[i])down[i]=true;
if(x[i]<r[i]){
Left[i]=true;
lc[i]=y[i]-sqrt(r[i]*r[i]-x[i]*x[i]);
}
if(y[i]+r[i]>1000)up[i]=true;
if(x[i]+r[i]>1000){
Right[i]=true;
rc[i]=y[i]-sqrt(r[i]*r[i]-(1000-x[i])*(1000-x[i]));
}
}
for(int i=1;i<=n;i++){
if(up[i]&&!vis[i])
for(int j=1;j<=n;j++)
if(father[i]==father[j]){
vis[j]=true;
if(down[j]){
printf("Bill will be bitten.");
return 0;
}
if(Left[j]&&lc[j]<maxl)maxl=lc[j];
if(Right[j]&&rc[j]<maxr)maxr=rc[j];
}
}
printf("Bill enters at (0.00, %.2lf) and leaves at (1000.00, %.2lf).\n", maxl, maxr);
}