1.先按x从小到大排序,再按y从小到大排序,x值相同的各点数肯定为偶数且从下到上两两匹配形成一组线段
2.判断在点内点外的方法应该会几何的都知道。。。毕竟我这种渣货都能熟练敲出来。
#include<cstdio>
#include<cmath>
#include<cstdlib>
struct point{
int x,y;
}p[20000],p1;
int cmp(const void *a,const void *b)
{
struct point *c = (struct point *)a; struct point *d = (struct point*)b;
if(c->x != d->x)
return c->x - d->x;
else
return d->y - c->y;
}
int cmp2(const void *a,const void *b)
{
struct point *c = (struct point *)a; struct point *d = (struct point*)b;
if(c->y != d->y)
return c->y - d->y;
else
return d->x - c->x;
}
int n;
int main(){
while(scanf("%d",&n)!=EOF)
{
bool sym = true;
int sum1 = 0,sum2 = 0;
for(int i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
scanf("%d%d",&p1.x,&p1.y);
//
qsort(p,n,sizeof(p[0]),cmp);
for(int i=0;i<n;i+=2)
{
if(p1.y<=p[i].y&&p1.y>p[i+1].y)
{
if(p1.x==p[i].x){sym = false;break;}
else if(p[i].x>p1.x)sum1++;
else if(p[i].x<p1.x)sum2++;
}
}
//
qsort(p,n,sizeof(p[0]),cmp2);
for(int i=0;i<n;i+=2)
{
if(p1.x<=p[i].x&&p1.x>=p[i+1].x)
{
if(p1.y==p[i].y){sym = false;break;}
}
}
//
if(sym)
{
if(sum1%2&&sum2%2)printf("INSIDE\n");
else printf("OUTSIDE\n");
}
else printf("BORDER\n");
}
return 0;
}