diff options
Diffstat (limited to 'ntu/moco.c')
-rw-r--r-- | ntu/moco.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/ntu/moco.c b/ntu/moco.c new file mode 100644 index 0000000..9354a0f --- /dev/null +++ b/ntu/moco.c @@ -0,0 +1,77 @@ +#include <stdio.h> + +typedef struct { + short x; + short y; +} point_t; + +point_t a, b, c, d; + +long long cross_product(point_t m, point_t n, point_t p, point_t q) +{ + return (n.x - m.x) * (q.y - p.y) - (q.x - p.x) * (n.y - m.y); +} + +char convex() +{ + if (cross_product(a, c, c, b) * cross_product(a, c, c, d) > 0) + return 0; + if (cross_product(b, d, d, a) * cross_product(b, d, d, c) > 0) + return 0; + return 1; +} + +void swap(point_t *m, point_t *n) +{ + short tmp = m->x; + m->x = n->x; + n->x = tmp; + tmp = m->y; + m->y = n->y; + n->y = tmp; +} + +long long dot_product(point_t m, point_t n, point_t p, point_t q) +{ + return (n.x - m.x) * (q.x - p.x) + (n.y - m.y) * (q.y - p.y); +} + +char f2() +{ + return !dot_product(a, b, b, c); +} + +char f3() +{ + return !dot_product(a, c, b, d); +} + +char f4() +{ + return (a.x + c.x == b.x + d.x) && (a.y + c.y == b.y + d.y); +} + +int main() +{ + scanf("%hd %hd %hd %hd %hd %hd %hd %hd", + &a.x, &a.y, &b.x, &b.y, &c.x, &c.y, &d.x, &d.y); + + if (!convex()) { + swap(&a, &b); + if (!convex()) + swap(&b, &c); + } + + char val = 5; + if (f4()) { + val = 4; + if (f2()) + val = 2; + if (f3()) + val--; + } + + printf("%hhd\n", val); + + return 0; +} |