题目链接点这儿
题目就是给你一个多边形,再给个点,让你判断点是否在多边形内部。
妥妥的射线法。而且题目中说边都是平行于坐标轴的,那判断的时候就更省事了。
射线法可以看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; }