http://acm.hdu.edu.cn/showproblem.php?pid=2108
几何计算,判断线段的转向。
View Code
#include <stdio.h> #include <string.h> #include <math.h> typedef struct point{ int x,y; }point; point kk[100000]; int dis(point p1,point p2,point p3) { return (p3.x-p1.x)*(p2.y-p1.y)-(p2.x-p1.x)*(p3.y-p1.y); } int main() { int n,i; while(scanf("%d",&n),n) { for(i=0;i<n;i++) scanf("%d%d",&kk[i].x,&kk[i].y); int flag,f=0; if(dis(kk[0],kk[1],kk[2])>0) flag=0; else flag=1; for(i=1;i<n-2;i++) { if(dis(kk[i],kk[i+1],kk[i+2])<0&&flag==0) { f=1; break; } if(dis(kk[i],kk[i+1],kk[i+2])>0&&flag) { f=1; break; } } if(dis(kk[n-2],kk[n-1],kk[0])<0&&flag==0) f=1; if(dis(kk[n-2],kk[n-1],kk[0])>0&&flag) f=1; if(dis(kk[n-1],kk[0],kk[1])<0&&flag==0) f=1; if(dis(kk[n-1],kk[0],kk[1])>0&&flag) f=1; if(f) printf("concave\n"); else printf("convex\n"); } return 0; }