11853:Paintball

Paintball

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 5;
int n;
int ops[maxn][3];
int G[maxn][maxn];
int visited[maxn];
int up[maxn], down[maxn];
int Left[maxn], Right[maxn];

int connect(int i,int j){
    return pow(ops[i][2]+ops[j][2],2) >= pow(ops[i][0]-ops[j][0],2) + pow(ops[i][1]-ops[j][1],2);
}

void calCross(int i,int x,int& y0,int& y1){
    double dy = sqrt(pow(ops[i][2],2) - pow(ops[i][0]-x,2));
    int y = ops[i][1];
    if(y+dy >= 1000) y1 = y-dy;
    if(y-dy <= 0) y0 = y+dy;
}

int DFS(int i){
    if(down[i]) return 1;
    visited[i] = 1;
    int mark = 0;
    for(int j = 0;j < n;j++){
        if(G[i][j] && !visited[j]){ // j !!!
            mark = DFS(j);
            if(mark) break;
        }
    }
    return mark;
}
int main()
{
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    while(scanf("%d",&n) != EOF){
        memset(visited,0,sizeof(visited));
        memset(G,0,sizeof(G));
        memset(up,0,sizeof(up));
        memset(down,0,sizeof(down));
        memset(Left,0,sizeof(Left));
        memset(Right,0,sizeof(Right));
        for(int i = 0;i < n;i++){
            scanf("%d%d%d",&ops[i][0],&ops[i][1],&ops[i][2]);
        }
        for(int i = 0;i < n;i++){
            int x = ops[i][0];
            int y = ops[i][1];
            int r = ops[i][2];
            if(x - r <= 0) Left[i] = 1;
            if(x + r >= 1000) Right[i] = 1;
            if(y + r >= 1000) up[i] = 1;
            if(y - r <= 0) down[i] = 1;
            for(int j = i+1;j < n;j++){
                if(connect(i,j)) G[i][j] = G[j][i] = 1;
            }
        }
        int mark = 0;
        for(int i = 0;i < n;i++){
            if(up[i] && !visited[i]){
                mark = DFS(i);
                if(mark) break;
            }
        }
        if(!mark){
            double y0 = 0,y1 = 1000,y2 = 0,y3 = 1000;
            for(int i = 0;i < n;i++){
                if(Left[i]) calCross(i,0,y0,y1);
                if(Right[i]) calCross(i,1000,y2,y3);
            }
            printf("0.00 %.2f 1000.00 %.2f\n",y0,y1);
        }
        else puts("IMPOSSIBLE");
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章