hdu 2108(判断多边形是凸的,还是凹的)

/*
*  利用叉乘判断多边形是凸的,还是凹的
*  auther:Try86 
*/

#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;

struct point {
    int x;
    int y;
}A, B, C, tA, tB;

int crossProd(point A, point B, point C) {
    return (B.x-A.x)*(C.y-A.y) - (B.y-A.y)*(C.x-A.x);
}

int main() {
    int n;
    while (scanf("%d", &n), n) {
        if (n < 3) {
            for (int i=0; i<n; ++i) scanf ("%d%d", &A.x, &A.y);
            printf ("concave\n");
            continue;
        }
        scanf ("%d%d%d%d%d%d", &A.x, &A.y, &B.x, &B.y, &C.x, &C.y);
        tA = A, tB = B;
        bool yes = true;
        int counts = 0;  //判断多边形是否退化为一条线,但该题没有这样的测试数据 
        for (int i=2; i<n; ++i) {
            if (yes) {
                A = B;
                B = C;
                if (crossProd(A, B, C) < 0) yes = false;
                else if (crossProd(A, B, C) == 0) ++counts;
            }
            if (i < n - 1) scanf ("%d%d", &C.x, &C.y);
        }
        if (crossProd(B, C, tA) < 0) yes = false;
        else if (crossProd(B, C, tA) == 0) ++counts;
        if (crossProd(C, tA, tB) < 0) yes = false;
        else if (crossProd(C, tA, tB) == 0) ++counts;
        if (yes && counts<n) printf ("convex\n");
        else printf ("concave\n");
    }
    return 0;
}

 

posted on 2012-04-22 21:37  Try86  阅读(406)  评论(0)    收藏  举报