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; }
本来想建一个共线凸包的,写了不知道那里出现为题了,现在只能建一个不共线凸包,然后判断每一条边了,朋友的代码,很多函数都是他自己写的,贴一份自己作模版。
相关文章推荐
- Grandpa's Estate - POJ 1228(稳定凸包)
- poj 1228 凸包
- POJ 1873 & 1228 凸包和稳定凸包
- POJ 1228 稳定凸包问题
- POJ 1228 Grandpa's Estate(给定凸包上的一部分顶点 判断表示的凸包是否唯一)
- Grandpa's Estate - POJ 1228(稳定凸包)
- 【POJ】1228 Grandpa's Estate(凸包)
- POJ 1228 Grandpa's Estate(凸包应用:稳定凸包)
- poj 1228 稳定凸包
- poj 1228 凸包(能否恢复农场形状)
- 【凸包性质】 POJ 1228 Grandpa's Estate
- poj 1228 判唯一凸包
- POJ 1228 凸包
- POJ 1228 凸包,判断点在线段上
- POJ 1228 Grandpa's Estate 【计算几何:凸包,andrew】
- POJ 1228 Grandpa's Estate(确定凸包)
- POJ-1228(稳定凸包)
- POJ 1228 (凸包)
- POJ 1228 判断原始凸包是否唯一
- [POJ 1228] Grandpa's Estate · 凸包