題目鏈接點這兒
題目就是給你一個多邊形,再給個點,讓你判斷點是否在多邊形內部。
妥妥的射線法。而且題目中說邊都是平行於座標軸的,那判斷的時候就更省事了。
射線法可以看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;
}