Feng Shui POJ

来源:互联网 发布:最精准的足彩数据分析 编辑:程序博客网 时间:2024/05/17 04:39

题目链接:https://cn.vjudge.net/problem/POJ-3384

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include <iostream>#define eps 1e-10using namespace std;struct point{    double x,y;}points[110],p[110],q[110];int n,curcnt,cCnt,m;void guizheng(){    for(int i=1;i<=n;++i){        q[i]=points[n-i+1];    }    for(int i=1;i<=n;++i){        points[i]=q[i];    }}double juli(point p1, point p2){    return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);}void getline(point p1,point p2,double &a,double &b,double &c){    a=p2.y-p1.y;    b=p1.x-p2.x;    c=p2.x*p1.y-p2.y*p1.x;}void init(){    for(int i=1;i<=n;++i){        p[i]=points[i];    }    p[n+1]=p[1];p[0]=p[n];    cCnt=n;}point getinter(point p1,point p2,double a,double b,double c){    double u=fabs(a*p1.x+b*p1.y+c);    double v=fabs(a*p2.x+b*p2.y+c);    point temp;    temp.x=(v*p1.x+u*p2.x)/(u+v);    temp.y=(v*p1.y+u*p2.y)/(u+v);    return temp;}void cut(double a,double b,double c){    curcnt=0;    for(int i=1;i<=cCnt;++i){        if(a*p[i].x+b*p[i].y+c>=0)q[++curcnt]=p[i];        else{            if(a*p[i-1].x+b*p[i-1].y+c>0){                q[++curcnt]=getinter(p[i],p[i-1],a,b,c);            }            if(a*p[i+1].x+b*p[i+1].y+c>0)                q[++curcnt]=getinter(p[i],p[i+1],a,b,c);        }    }    for(int i=1;i<=curcnt;++i){        p[i]=q[i];    }    p[curcnt+1]=q[1];    p[0]=p[curcnt];    cCnt=curcnt;}void solve(){    points[n+1]=points[1];    init();    for(int i=1;i<=n;++i){        point ta,tb,tc;        tc.x=points[i+1].y-points[i].y;        tc.y=points[i].x-points[i+1].x;        double k=m/sqrt(tc.x*tc.x+tc.y*tc.y);        tc.x*=k;tc.y*=k;        ta.x=points[i].x+tc.x;        ta.y=points[i].y+tc.y;        tb.x=points[i+1].x+tc.x;        tb.y=points[i+1].y+tc.y;        double a,b,c;        getline(ta,tb,a,b,c);        cut(a,b,c);    }    double max=-1;    int r1,r2;    for(int i=1;i<=cCnt;++i){        for(int j=i+1;j<=cCnt;++j){            double temp= juli(p[i], p[j]);            if(temp>max){                max=temp;                r1=i;r2=j;            }        }    }    printf("%.6lf %.6lf %.6lf %.6lf\n",p[r1].x,p[r1].y,p[r2].x,p[r2].y);}int main(){    int i,j,k;    while(~scanf("%d%d",&n,&m)){        for(i=1;i<=n;++i){            scanf("%lf%lf",&points[i].x,&points[i].y);        }        solve();    }    return 0;}
原创粉丝点击