题目链接点这儿
题目就是给你一个多边形,再给个点,让你判断点是否在多边形内部。
妥妥的射线法。而且题目中说边都是平行于坐标轴的,那判断的时候就更省事了。
射线法可以看lrj的白书,也可以看这篇博客
但是这题好诡异。。。如果是一条平行x轴向左的射线只能取经过上端点为经过这条边。。。如果去经过下端点为经过这条边的话。。。wa on test15.。。。向右的射线和向上向下都没有这种情况。。。。无法理解。。。
下面是代码
#include <bits/stdc++.h>
#define max(a,b) ((a)>(b))?(a):(b)
#define min(a,b) ((a)>(b))?(b):(a)
#define rep(i,initial_n,end_n) for(int (i)=(initial_n);(i)<(end_n);i++)
#define repp(i,initial_n,end_n) for(int (i)=(initial_n);(i)<=(end_n);(i)++)
#define eps 1.0E-8
#define MAX_N 1010
#define INF 1 << 30
using namespace std;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef long long ll;
typedef unsigned long long ull;
pii v1[10001], v2[10001];
int main() {
int n;
scanf("%d", &n);
rep(i, 0, n) {
scanf("%d%d", &v1[i].first, &v1[i].second);
scanf("%d%d", &v2[i].first, &v2[i].second);
if(v1[i].first > v2[i].first) swap(v1[i].first, v2[i].first);
if(v1[i].second > v2[i].second) swap(v1[i].second, v2[i].second);
}
pii point;
scanf("%d%d", &point.first, &point.second);
int cnt = 0;
rep(i, 0, n) {
if(v1[i].first == v2[i].first) {
if(v1[i].first == point.first && v1[i].second <= point.second && v2[i].second >= point.second) {
puts("BORDER");
exit(0);
}
if(v1[i].first < point.first && v1[i].second <= point.second && v2[i].second > point.second)
cnt++;
}
else if(v1[i].second == v2[i].second &&
v1[i].first <= point.first && v2[i].first >= point.first) {
if(v1[i].second == point.second) {
puts("BORDER");
exit(0);
}
}
}
if(cnt&1) puts("INSIDE");
else puts("OUTSIDE");
return 0;
}