暑假集训#1 B题
Crawling in process...Crawling failed Time Limit:500MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64u
Description
There is a closed broken line on a plane with sides parallel to coordinate axes, without self-crossings and self-contacts. The broken line consists of K segments. You have to determine, whether a given point with coordinates (X0,Y0) is inside this closed broken line, outside or belongs to the broken line.
Input
The first line contains integer K (4ЈK Ј 10000) - the number of broken line segments. Each of the following N lines contains coordinates of the beginning and end points of the segments (4 integerxi1,yi1,xi2,yi2; all numbers in a range from -10000 up to 10000 inclusive). Number separate by a space. The segments are given in random order. Last line contains 2 integersX0 and Y0- the coordinates of the given point delimited by a space. (NumbersX0, Y0in a range from -10000 up to 10000 inclusive).
Output
The first line should contain:
INSIDE - if the point is inside closed broken line,
OUTSIDE - if the point is outside,
BORDER - if the point belongs to broken line.
Sample Input
4 0 0 0 3 3 3 3 0 0 3 3 3 3 0 0 0 2 2
Sample Output
INSIDE
这是个计算几何问题,给出了很多的折线形成了一个封闭的图形,然后给出个点判断点是在多边形内或者外或者在多边形上。
方法是从给出的点出发做射线,检查边与射线的交点个数,如果是奇数个点的话就说明在多边形内,如果是偶数则是在多边形外,若检查出该点在边上就说明在多边形的边上。
对题目给出的各个边进行遍历,检查线段始末点的坐标和给出的坐标之间的关系确定焦点个数。对了要注意的一个问题就是线段的端点一端是属于线段,一端是属于线段外的。
#include<iostream> #include<stdio.h> #define INF 100100 #define MAX 100001 using namespace std; struct Segment{ int x1,y1,x2,y2; }sgm[MAX]; int main() { int n; while(cin>>n) { for(int i=0;i<n;i++) { int t1,t2,t3,t4; cin>>t1>>t2>>t3>>t4; if(t2<=t4) { sgm[i].x1=t1; sgm[i].y1=t2; sgm[i].x2=t3; sgm[i].y2=t4; } else { sgm[i].x1=t3; sgm[i].y1=t4; sgm[i].x2=t1; sgm[i].y2=t2; } } int count=0; int x,y; cin>>x>>y; bool boarder=false; for(int i=0;i<n;i++) { if(sgm[i].x1==sgm[i].x2&&sgm[i].x1>x&&y>=sgm[i].y1&&y<sgm[i].y2) { count++; } } for(int i=0;i<n;i++) { if((sgm[i].x1==sgm[i].x2&&sgm[i].x1==x)&&(y>=sgm[i].y1&&y<=sgm[i].y2)) { boarder=true; } if(sgm[i].y1==sgm[i].y2&&sgm[i].y1==y) { if(sgm[i].x1<sgm[i].x2&&x>=sgm[i].x1&&x<=sgm[i].x2) boarder=true; if(sgm[i].x1>sgm[i].x2&&x>=sgm[i].x2&&x<=sgm[i].x1) boarder=true; } } if(boarder) { cout<<"BORDER"<<endl; } else if(count%2!=0) { cout<<"INSIDE"<<endl; } else cout<<"OUTSIDE"<<endl; } }