您的位置:首页 > 其它

poj 1228(凸包)

2012-08-29 10:05 369 查看
#include<stdio.h>
typedef struct
{
int x,y;
}point;

int cross(point op, point sp, point ep)
{
int t;
t=(sp.x-op.x) * (ep.y-op.y) - (ep.x-op.x) * (sp.y-op.y);
if(t>0)
return 1;
else if(t<0)
return -1;
else
return 0;
}
int cmp(point a,point b)
{
if(a.y>b.y)
return 1;
if(a.y==b.y)
{
if(a.x>b.x)
return 1;
}
return 0;
}
void quick_sort (point *p,int low,int high)
{
if(low>=high)
return;
int i,j;
point temp;
i=low;
j=high;
temp=p[i];
while(i<j)
{
while(i<j && cmp(p[j],temp))					//p[j]>temp
j--;
if(i<j)
p[i++]=p[j];
while(i<j && cmp(temp,p[i]))					//p[i]<temp
i++;
if(i<j)
p[j--]=p[i];
}
p[i]=temp;
quick_sort(p,low,i-1);
quick_sort(p,i+1,high);
}

int graham(point pnt[], int n, point res[])
{
int i, len, k = 0, top = 1;
quick_sort(pnt,0,n-1);
if(n==0)
return 0;
res[0]=pnt[0];
if(n==1)
return 1;
res[1]=pnt[1];
if(n==2)
return 2;
res[2]=pnt[2];
for (i=2;i<n;i++) {
while (top && cross(pnt[i],res[top],res[top-1])>=0)
top--;
res[++top]=pnt[i];
}
len=top;
res[++top]=pnt[n-2];

for(i=n-3;i>=0;i--)
{
while(top!=len && cross(pnt[i],res[top],res[top-1])>=0)
top--;
res[++top]=pnt[i];
}
return top;
}
int judge(point *p,point *t,int n,int top)
{
int i,j,ok,find;
int used[1005]={0};
if(n<5)
return 0;
ok=0;
for(i=0;i<n-2;i++)
{
if(0!=cross(p[i],p[i+1],p[i+2]))
{
ok=1;
break;
}
}
if(0==ok)
return 0;
for(i=0;i<top;i++)
{
for(j=0;j<n;j++)
{
if(t[i].x==p[j].x && t[i].y==p[j].y)
{
used[j]=1;
break;
}
}
}
for(i=0;i<top-2;i++)
{
find=0;
for(j=0;j<n;j++)
{
if(!used[j] && 0==cross(t[i],p[j],t[i+1]))
{
find=1;
break;
}
}
if(!find)
break;
}
if(find)
return 1;
return 0;
}
int main()
{
int T,n,i,j,top,res;
point p[1005],t[1005];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
top=graham(p,n,t);
res=judge(p,t,n,top);
if(res)
printf("YES\n");
else
printf("NO\n");
//		for(i=0;i<top;i++)
//			printf("%d %d\n",t[i].x,t[i].y);
}
return 0;
}


本来想建一个共线凸包的,写了不知道那里出现为题了,现在只能建一个不共线凸包,然后判断每一条边了,朋友的代码,很多函数都是他自己写的,贴一份自己作模版。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct ini