首页 > 代码库 > hdu2108
hdu2108
Shape of HDU
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5134 Accepted Submission(s): 2334
Problem Description
话说上回讲到海东集团推选老总的事情,最终的结果是XHD以微弱优势当选,从此以后,“徐队”的称呼逐渐被“徐总”所取代,海东集团(HDU)也算是名副其实了。
创业是需要地盘的,HDU向钱江肉丝高新技术开发区申请一块用地,很快得到了批复,据说这是因为他们公司研发的“海东牌”老鼠药科技含量很高,预期将占全球一半以上的市场。政府划拨的这块用地是一个多边形,为了描述它,我们用逆时针方向的顶点序列来表示,我们很想了解这块地的基本情况,现在请你编程判断HDU的用地是凸多边形还是凹多边形呢?
创业是需要地盘的,HDU向钱江肉丝高新技术开发区申请一块用地,很快得到了批复,据说这是因为他们公司研发的“海东牌”老鼠药科技含量很高,预期将占全球一半以上的市场。政府划拨的这块用地是一个多边形,为了描述它,我们用逆时针方向的顶点序列来表示,我们很想了解这块地的基本情况,现在请你编程判断HDU的用地是凸多边形还是凹多边形呢?
Input
输入包含多组测试数据,每组数据占2行,首先一行是一个整数n,表示多边形顶点的个数,然后一行是2×n个整数,表示逆时针顺序的n个顶点的坐标(xi,yi),n为0的时候结束输入。
Output
对于每个测试实例,如果地块的形状为凸多边形,请输出“convex”,否则输出”concave”,每个实例的输出占一行。
Sample Input
4
0 0 1 0 1 1 0 1
0
Sample Output
convex
这道题和hdu2907题的思路是一样的 ,凸包+简单搜索
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<math.h> 5 #include<algorithm> 6 using namespace std; 7 const int N=40; 8 struct point 9 {10 double x,y;11 double angel;12 int id;13 } p[N],stack[N];14 int top,n;15 16 double dis(point a,point b)//求距离17 {18 return sqrt ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));19 }20 21 bool mult(point p1,point p2,point p0)//叉乘22 {23 return (p1.x-p0.x)*(p2.y-p0.y) >= (p2.x-p0.x)*(p1.y-p0.y);24 }25 26 bool cmp(point a,point b)27 {28 if(a.angel == b.angel)29 {30 if (a.x == b.x)31 return a.y > b.y;32 return a.x > b.x;33 }34 return a.angel < b.angel;35 }36 37 void graham()38 {39 //p为点集,n为点的个数,stack为凸包点集,top为凸包个数40 int i,k=0;41 point temp;42 for(i=0; i<n; i++)43 if(p[i].y<p[k].y||((p[i].y==p[k].y)&&(p[i].x<p[k].x)))44 k=i;45 temp=p[0];46 p[0]=p[k];47 p[k]=temp;48 for(i=1; i<n; i++)49 p[i].angel=atan2(p[i].y-p[0].y,p[i].x-p[0].x);50 sort(p+1,p+n,cmp);51 stack[0]=p[0];52 stack[1]=p[1];53 stack[2]=p[2];54 top=3;55 for(i=3; i<n; i++)56 {57 while(top > 2 && mult(stack[top-2],stack[top-1],p[i])<=0)58 top--;59 stack[top++]=p[i];60 }61 }62 int main()63 {64 int i,j,t,pp,q,cnt,ans;65 int flag[500];66 while(scanf("%d",&n)!=EOF&&n)67 {68 cnt=0;69 for(i=0; i<n; i++)70 {71 scanf("%lf%lf",&p[i].x,&p[i].y);72 p[i].id=i;73 }74 graham();75 memset(flag,0,sizeof(flag));76 for(i=0; i<top; i++)77 {78 flag[stack[i].id]=1;79 }80 flag[n]=flag[0];81 for(i=0; i<n; i++)82 {83 if(flag[i]==1&&flag[i+1]==0)84 {85 cnt++;86 break;87 }88 }89 if(cnt>0)90 printf("concave\n");91 else92 printf("convex\n");93 }94 return 0;95 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。