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;
}