SGU 124.Broken line
时间限制:0.25s
空间限制:4M
题意:
给出n条线段和一个点,保证所有线段平行X轴或Y,并且闭合成一个多边形。判断这个点的位置是在多边形上,还是多边形内,还是多边形外。
solution:
由于,所有的线段都平行于X轴或Y轴且闭合,那么只要判断在点的正上方有多少条线段即可。
如果是奇数,则在多边形内,偶数在多边形外。特判在多边形上的情况。
参考代码
#include <cstdio> #include <iostream> using namespace std; struct node { int x1, y1, x2, y2; } f[11111]; int x, y, n, ans; int main() { scanf ("%d", &n); for (int i = 1; i <= n; ++i) { scanf ("%d %d %d %d", &f[i].x1, &f[i].y1, &f[i].x2, &f[i].y2); if (f[i].x1 > f[i].x2) swap (f[i].x1, f[i].x2); if (f[i].y1 > f[i].y2) swap (f[i].y1, f[i].y2); } scanf ("%d %d", &x, &y); int ans = 0; for (int i = 1; i <= n; ++i) { if (f[i].x1 == f[i].x2) if (x == f[i].x1 && f[i].y1 <= y && y <= f[i].y2) { puts ("BORDER"); return 0; } if (f[i].y1 == f[i].y2) { if (y == f[i].y1 && f[i].x1 <= x && x <= f[i].x2) { puts ("BORDER"); return 0; } if (f[i].y1 > y && f[i].x1 < x && x <= f[i].x2) ans++; } } if (ans & 1) puts ("INSIDE"); else puts ("OUTSIDE"); return 0; }