Codeforces 474 C. Captain Marmot
4*4*4*4暴力+点的旋转+推断正方型
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const double pi=3.1415926/2.; const int INF=0x3f3f3f3f; int n; struct PT { double x,y,hx,hy; }pt[10][10]; struct Point { int x,y; }A,B,C,D; int isSQRT(Point a,Point b,Point c,Point d) { int i,j,sumt=0,sumo=0; double px[10],py[10];//代表6条边的 向量 double y[10]; memset(y,0,sizeof(y)); px[1]=a.x-b.x; py[1]=a.y-b.y; px[2]=a.x-c.x; py[2]=a.y-c.y; px[3]=a.x-d.x; py[3]=a.y-d.y; px[4]=b.x-c.x; py[4]=b.y-c.y; px[5]=b.x-d.x; py[5]=b.y-d.y; px[6]=c.x-d.x; py[6]=c.y-d.y; for(i=1; i<=6; i++) { for(j=i+1; j<=6; j++) if((px[i]*px[j]+py[i]*py[j])==0)//推断垂直 { y[i]++; y[j]++; } } for(i=1; i<=6; i++) { if(y[i]==2) sumt++;//有2条边 与其垂直的个数 if(y[i]==1) sumo++;//有1条边 与其垂直的个数 } if(sumt==4&&sumo==2) return 1;// 是正方形 if(sumt==4) return 0;//是 矩形 return 0;//都不是 } int main() { scanf("%d",&n); while(n--) { for(int i=0;i<4;i++) { double a,b,c,d; scanf("%lf%lf%lf%lf",&a,&b,&c,&d); pt[i][0].x=a,pt[i][0].y=b; pt[i][0].hx=c,pt[i][0].hy=d; ///.... for(int j=1;j<4;j++) { pt[i][j].x=pt[i][j-1].x; pt[i][j].y=pt[i][j-1].y; pt[i][j].hx=pt[i][j-1].hx; pt[i][j].hy=pt[i][j-1].hy; ///x0= (x - rx0)*cos(a) - (y - ry0)*sin(a) + rx0 ; ///y0= (x - rx0)*sin(a) + (y - ry0)*cos(a) + ry0 ; pt[i][j].x=(pt[i][j-1].x-pt[i][j-1].hx)*0-(pt[i][j-1].y-pt[i][j-1].hy)*1+pt[i][j-1].hx; pt[i][j].y=(pt[i][j-1].x-pt[i][j-1].hx)*1+(pt[i][j-1].y-pt[i][j-1].hy)*0+pt[i][j-1].hy; } } int ans=INF; for(int i1=0;i1<4;i1++) { for(int i2=0;i2<4;i2++) { for(int i3=0;i3<4;i3++) { for(int i4=0;i4<4;i4++) { int temp=i1+i2+i3+i4; if(temp>ans) continue; A.x=pt[0][i1].x;A.y=pt[0][i1].y; B.x=pt[1][i2].x;B.y=pt[1][i2].y; C.x=pt[2][i3].x;C.y=pt[2][i3].y; D.x=pt[3][i4].x;D.y=pt[3][i4].y; if(isSQRT(A,B,C,D)==true) ans=min(ans,temp); } } } } if(ans==INF) ans=-1; printf("%d\n",ans); } return 0; }