Hello guys..I am getting RE on 11800.I can't find out the problem.
Actually I have used convex hull to sort the point.
got RE.
Again,I have used another method using the maximum angle of rectangles and Got AC.
Code: Select all
/////////////convex hull 11800 //////////////////
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define PI 3.141592653589793;
//#define INF 24859675
const int MAXN=5;
typedef struct
{
long double x,y;
}Point;
Point p[MAXN];
Point p0={0,0};
//long double F[5];
long double dis(int a,int b){
return (sqrt((p[a].x-p[b].x)*(p[a].x-p[b].x)+(p[a].y-p[b].y)*(p[a].y-p[b].y)));
}
long double comp(int c,int a,int b)
{
long double C,A,B;
C=dis(a,b);
A=dis(c,b);
B=dis(c,a);
//cout<<A<<" "<<B<<" "<<C<<" ";
long double angle=acos(((B*B)+(A*A)-(C*C))/2/A/B)*180/PI;
// cout<<angle<<endl;
//cout<<endl<<endl<<endl;
return angle;
}
bool cmp1(const Point a,const Point b)
{
if( a.y == b.y )
return a.x < b.x;
else
return a.y < b.y;
}
long double xmult(Point p1,Point p2,Point p0)//²?»>0??¹?
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
//return (p1.x*(p2.y-p0.y)-p1.y*(p2.x-p0.x)+(p2.x*p0.y-p0.x*p2.y));
}
bool cmp2(const Point a,const Point b)//¼«½????
{
if( xmult(a,b,p0) < 0 ) return false;
else return true;
}
int main()
{
int i,j;
long double d1,d2,d3,d4,r1,r2,m1,m2,T1,T2,T3,T4,s,m3,m4;
long n = 0,l,c;
//freopen("pp.txt","r",stdin);
scanf("%ld",&l);
for(c=0;c<l;c++){
for(n=0;n<4;n++)
{
//scanf("%lf %lf",&p[n].x,&p[n].y) ;
cin>>p[n].x>>p[n].y;
}
//sort(p+1,p+n,cmp1);
sort(p+1,p+n,cmp2);
//sort(p+1,p+n);
int top = -1,S[MAXN];
S[++top] = 0;
S[++top] = 1;
for( i = 2 ; i < n ; i ++ )//grahamScan?¨?è·¨
{
while( xmult(p[i],p[S[top]],p[S[top-1]]) > 0 )
top --;
S[++top] = i;
}
/*
for( i = 0 ; i <= top ; i ++ )
printf("(%.lf,%.lf)\n",p[i].x,p[i].y);
printf("\n\n");
*/
/*
F[1]=comp(0,3,2);
F[2]=comp(0,1,3);
F[3]=comp(0,1,2);
//cout<<F[1]<<" "<<F[2]<<" "<<F[3]<<endl;
if(F[1]>= F[2]&& F[1]>=F[3])
{
r1=p[2].x;
p[2].x=p[1].x;
p[1].x=r1;
r2=p[2].y;
p[2].y=p[1].y;
p[1].y=r2;
}
//else if(F[2]>= F[1]&& F[2]>=F[3])
//{
//}
else if(F[3]>= F[2]&& F[3]>=F[1])
{
r1=p[2].x;
p[2].x=p[3].x;
p[3].x=r1;
r2=p[2].y;
p[2].y=p[3].y;
p[3].y=r2;
}
*/
//cout<<endl<<p[0].x<<","<<p[0].y<<endl<<p[1].x<<","<<p[1].y<<endl<<p[2].x<<","<<p[2].y<<endl<<p[3].x<<","<<p[3].y<<endl;
d1= dis(0,1);
d2= dis(1,2);
T1=comp(0,1,3);
T2=comp(1,2,0);
T3=comp(2,1,3);
T4=comp(3,0,2);
if(T1==T2&&T2==T3&&T1==T4){
if(d1==d2)
printf("Case %ld: Square\n",c+1);
else
printf("Case %ld: Rectangle\n",c+1);
}
else if(T1==T3&&T2==T4){
if(d1==d2)
printf("Case %ld: Rhombus\n",c+1);
else
printf("Case %ld: Parallelogram\n",c+1);
}
else{
/*
if(p[0].x-p[1].x==0)
m1=INF;
else
m1=(p[0].y-p[1].y)/(p[0].x-p[1].x);
if(p[3].x-p[2].x==0)
m2=INF;
else
m2=(p[3].y-p[2].y)/(p[3].x-p[2].x);
if(p[0].x-p[3].x==0)
m3=INF;
else
m3=(p[0].y-p[3].y)/(p[0].x-p[3].x);
if(p[1].x-p[2].x==0)
m4=INF;
else
m4=(p[1].y-p[2].y)/(p[1].x-p[2].x);
if(m1==m2&&m3!=m4)
printf("Case %ld: Trapezium\n",c+1);
else
printf("Case %ld: Ordinary Quadrilateral\n",c+1);
*/
s=0;
if(p[0].x==p[3].x && p[1].x==p[2].x)
s=1;
if(p[3].x==p[2].x&&p[0].x==p[1].x)
s=1;
if(p[0].y==p[3].y&&p[1].y==p[2].y)
s=1;
if(p[3].y==p[2].y&&p[0].y==p[1].y)
s=1;
if(s!=1){
if(p[0].x!=p[3].x && p[1].x!=p[2].x){
m1=(p[0].y-p[3].y)/(p[0].x-p[3].x);
m2=(p[1].y-p[2].y)/(p[1].x-p[2].x);
if(m1==m2)
s=1;
}
if(p[3].x!=p[2].x && p[0].x!=p[1].x){
m1=(p[3].y-p[2].y)/(p[3].x-p[2].x);
m2=(p[0].y-p[1].y)/(p[0].x-p[1].x);
if(m1==m2)
s=1;
}
}
if(s==1)
printf("Case %ld: Trapezium\n",c+1);
else
printf("Case %ld: Ordinary Quadrilateral\n",c+1);
}
}
return 0;
}
[color=#4040FF][/color]