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;
}
posted @ 2014-07-04 09:54  keambar  阅读(158)  评论(0编辑  收藏  举报