njust 1734 南京邀请赛热身赛 A题 Dinner

来源:互联网 发布:123网络测速 编辑:程序博客网 时间:2024/06/06 09:47
/*历时四个小时感动*/#include<cstdio>#include<cmath>#define eps 10e-4#define max(a,b) (a)>(b)?(a):(b)#define min(a,b) (a)>(b)?(b):(a)#define PI acos(-1)using namespace std;double x1,x2,x3,y2,y3,a,b,c,d,e,f,x,y,r,yy;double d12,d13,d23,t12,t13,t23;void getR()//算出半径 圆心{    a=2*(x2-x1);    b=2*(y2-yy);    c=x2*x2+y2*y2-x1*x1-yy*yy;    d=2*(x3-x2);    e=2*(y3-y2);    f=x3*x3+y3*y3-x2*x2-y2*y2;    x=(b*f-e*c)/(b*d-e*a);    y=(d*c-a*f)/(b*d-e*a);   r=sqrt((x-x1)*(x-x1)+(y-yy)*(y-yy));}void getD()//算出三个点之间的距离{    d12=sqrt((x1-x2)*(x1-x2)+(yy-y2)*(yy-y2));    d13=sqrt((x1-x3)*(x1-x3)+(yy-y3)*(yy-y3));    d23=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));}void getT()//算出三个角度{    t12=acos(1-d12*d12/(2*r*r));    t23=acos(1-d23*d23/(2*r*r));    t13=acos(1-d13*d13/(2*r*r));}int main(){    int i,k1,k2;    bool flag;    double top,mid,down;    while(scanf("%lf%lf%lf%lf%lf%lf",&x1,&yy,&x2,&y2,&x3,&y3)!=EOF)    {        flag=false;        getR();        getD();        getT();top=max(t12,t13);        top=max(top,t23);        down=min(t12,t13);        down=min(down,t23);        mid=t12+t13+t23-top-down;        for(i=3;i<=100;i++)        {            for(k1=1;k1<=i;k1++)                if(fabs(k1*(2*PI/i)-down)<eps)                {                    flag=true;                    break;                }            if(flag)            {                for(k2=1;k2<=i;k2++)                    if(fabs(k2*(2*PI/i)-mid)<eps)                    //{                      // if(fabs((i-k1-k2)*(2*PI/i)-2*PI-top)<eps)                            goto A;                    //}            }            flag = false;        }        A:;        if(flag)            printf("%d\n",i);        else            printf("NO\n");    }    return 0;}

原创粉丝点击