Codeforces Round #271 (Div. 2) C. Captain Marmot (暴力枚举+正方形判定)

来源:互联网 发布:程序编程和软件开发 编辑:程序博客网 时间:2024/05/16 13:05

题目链接:Codeforces Round #271 (Div. 2) C. Captain Marmot

题意:给4行数据,每行2个点。(x,y).(a,b)。意思是(x,y)绕(a,b)逆时针旋转90度。问最少的旋转次数使(x,y)的四个点形成一个正方形。

思路:

处理出 点旋转后 4种情况的点。

暴力查找哪四个点可以形成正方形。


正方形判定:

a,b,c,d四个点。

1.处理处4个点两两组合的边。ab,ac,ad,bc,bd,cd、

2.排序,把边分成2组,2组内的大小相等。2条边的作为对角线(l1)。4条边的作为边长(l2)。

3.l2==(根号2)*l2、则是正方形。else 都不是。


在处理的过程正用算角度,开根号。注意精度问题。


AC代码:


#include<stdio.h>#include<math.h>#include<string.h>#include<algorithm>using namespace std;const double PI=acos(-1.0);const double tt=sqrt(2.0);const double eps=1e-7;struct point{    double x,y;};struct point p[10][10];point change(double x,double y,double a,double b,double c){    c=c*PI/180.0;    point h;    x-=a,y-=b;    h.x=cos(c)*x-sin(c)*y+a;    h.y=sin(c)*x+cos(c)*y+b;    return h;}double dist(point a,point b){    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}bool ok(point a,point b,point c,point d){    int i;    double dis[10];    dis[0]=dist(a,b);    dis[1]=dist(a,c);    dis[2]=dist(a,d);    dis[3]=dist(b,c);    dis[4]=dist(b,d);    dis[5]=dist(c,d);    sort(dis,dis+6);//从小到大    if(fabs(dis[0]-dis[1])<eps && fabs(dis[1]-dis[2])<eps && fabs(dis[2]-dis[3])<eps)//边长    {        if(fabs(dis[0]-dis[4])>eps && fabs(dis[4]-dis[5])<eps)        {            if(fabs(dis[0]*tt-dis[4])<eps)                return true;        }    }    return false;}int main(){    int t,i,j,k,z,qiuguo;    scanf("%d",&t);    while(t--)    {        for(i=0;i<4;i++)        {            double x,y,a,b;            scanf("%lf %lf %lf %lf",&x,&y,&a,&b);            p[i][0].x=x;            p[i][0].y=y;            p[i][1]=change(x,y,a,b,90.0);            p[i][2]=change(x,y,a,b,180.0);            p[i][3]=change(x,y,a,b,270.0);        }        bool h=ok(p[0][0],p[1][1],p[2][0],p[3][0]);        int flag=0,min=1000000;        for(i=0;i<4;i++)        {            for(j=0;j<4;j++)            {                for(k=0;k<4;k++)                {                    for(z=0;z<4;z++)                    {                        if(ok(p[0][i],p[1][j],p[2][k],p[3][z]))                        {                            if(min>i+j+k+z)                                min=i+j+k+z;                            flag=1;                        }                    }                }            }        }        if(flag)            printf("%d\n",min);        else            printf("-1\n");    }    return 0;}



0 0
原创粉丝点击