Q - Shape of HDU HDU2108 向量的叉乘
判断折线往什么方向拐:
<1>点为(x1,y1),(x2,y2),(x3,y3)
<2>s = (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3)
(PS:记忆方法。。。。xyyx和1323 1323)
<3>s > 0时,逆时针拐;
s < 0时,顺时针拐。
#include <cstdio> #include <iostream> using namespace std; const int maxn = 1e5 + 10; int x[maxn], y[maxn]; int main() { int n, s; while(scanf("%d",&n),n) { int flag = 0; for (int i = 0;i <n;i++)scanf("%d %d", &x[i], &y[i]); for (int i = 0;i <n - 2;i++) { s = (x[i + 1] - x[i]) * (y[i + 2] - y[i]) - (x[i + 2] - x[i]) * (y[i + 1] - y[i]); if (s < 0) { printf("concave\n"); return 0; } } s = (x[n - 1] - x[n - 2]) * (y[0] - y[n - 1]) - (x[0] - x[n - 2]) * (y[n - 1] - y[n - 2]); if (s < 0)flag = 1; s = (x[0] - x[n - 1]) * (y[1] - y[0]) - (x[1] - x[n - 1]) * (y[0] - y[n - 1]); if (s < 0)flag = 1; flag == 1?printf("concave\n"): printf("convex\n"); } return 0; }

浙公网安备 33010602011771号