思路: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; }