poj 2165 Gunman

来源:互联网 发布:java简单聊天代码 编辑:程序博客网 时间:2024/06/14 11:10

//将三维坐标系转化为两个二维坐标系判断,分别x-z,z-y坐标系,相当于俯视图和左视图。

//若直线与Window相交,则在左视图和俯视图上必相交。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace
std;
const
double EP=1e-8;
struct
Point{double x, y, z;};
struct
Rect{Point lp, rp;}r[101];
struct
Line{double a, b, c;}l1;
double
xz_mult(Point sp, Point ep, Point op){
    return
(sp.x-op.x)*(ep.z-op.z)-(sp.z-op.z)*(ep.x-op.x);
}

Line makeline(Point p1, Point p2){
    Line t1;
    int
sign=1;
    t1.a=(p2.z-p1.z);
    if
(t1.a<EP){
        t1.a*=-1;
        sign=-1;
    }

    t1.b=sign*(p1.x-p2.x);
    t1.c=sign*(p1.z*p2.x-p1.x*p2.z);
    return
t1;
}

int
main(){
    //freopen("1.txt", "r", stdin);
    int n, i, j, k, cc, find, flag;
    double
kk, anx[101], any[101];
    Point p0, p1, p2, p3;
    scanf("%d", &n);
    for
(i=0; i<n; i++){
        scanf("%lf %lf %lf %lf %lf", &r[i].lp.x, &r[i].lp.y, &r[i].rp.x, &r[i].rp.y, &r[i].lp.z);
        r[i].rp.z=r[i].lp.z;
    }

    find=0;
    for
(i=0; i<n-1; i++){
        if
(find)break;
        for
(j=i+1; j<n; j++){
            if
(find)break;
            for
(cc=0; cc<4; cc++){
            flag=0;
            if
(cc==0){p1=r[i].lp;p2=r[j].lp;}
            else if
(cc==1){p1=r[i].lp;p2=r[j].rp;}
            else if
(cc==2){p1=r[i].rp;p2=r[j].rp;}
            else if
(cc==3){p1=r[i].rp;p2=r[j].lp;}
            for
(k=0; k<n; k++){
                if
(xz_mult(p2, r[k].lp, p1)*xz_mult(p2, r[k].rp, p1)>EP){
                    flag=1;break;
                }
            }

            if
(!flag){
                find=1;break;
            }
            }
        }
    }

    if
(!find){printf("UNSOLVABLE/n");return 0;}
    find=0;
    for
(i=0; i<n; i++){
        kk=(r[i].lp.y)/r[i].lp.z;
        flag=0;
        for
(j=0; j<n; j++){
            if
(kk*r[j].lp.z-r[j].rp.y>EP||kk*r[j].lp.z-r[j].lp.y<-EP){
                flag=1;break;
            }
        }

        if
(!flag){p3=r[i].lp; find =1; break;}
        kk=(r[i].rp.y)/r[i].lp.z;
        flag=0;
        for
(j=0; j<n; j++){
            if
(kk*r[j].lp.z-r[j].rp.y>EP||kk*r[j].lp.z-r[j].lp.y<-EP){
                flag=1;break;
            }
        }

        if
(!flag){p3=r[i].rp; find =1; break;}
    }

    if
(find){
        l1=makeline(p1, p2);
        double
x0=-l1.c/l1.a;
        for
(i=0; i<n; i++){
            anx[i]=-(r[i].lp.z*l1.b+l1.c)/l1.a;
            any[i]=kk*r[i].lp.z;
        }

        printf("SOLUTION/n%.6f/n", x0);
        for
(i=0; i<n; i++)
        printf("%.6f %.6f %.6f/n", anx[i],any[i],r[i].lp.z);

    }

    else
printf("UNSOLVABLE/n");
    return
0;
}

原创粉丝点击