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