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;

}

 

你可能感兴趣的:(HDU)