poj 1410 Intersection
2013-07-27 15:01
232 查看
题目描述良心大大地坏,大家一定要注意最后输入矩形的时候不一定是左上右下的输入,所以要做判断
根据题目意思,一条线段和矩形相交就是分成两部分:
1)矩形的四条边之一和这条线段相交
2)这条线段有一个点在矩形内
于是可以AC了
CODE:
根据题目意思,一条线段和矩形相交就是分成两部分:
1)矩形的四条边之一和这条线段相交
2)这条线段有一个点在矩形内
于是可以AC了
CODE:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; #define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++) #define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--) #define oo 1e6 #define eps 1e-8 #define nMax 1000 #define pb push_back #define bug puts("OOOOh....."); #define zero(x) (((x)>0?(x):-(x))<eps) int dcmp(double x){ if(fabs(x)<eps) return 0; return x>0?1:-1; } struct point { double x,y; point(double x=0,double y=0): x(x),y(y) {} void make(double _x,double _y) {x=_x;y=_y;} void read(){ scanf("%lf%lf",&x,&y); } double len(){ return sqrt(x*x+y*y); } friend point operator -(point const& u,point const& v) { return point(u.x-v.x,u.y-v.y); } friend point operator +(point const& u,point const& v) { return point(u.x+v.x,u.y+v.y); } friend double operator *(point const& u,point const& v) { return u.x*v.y-u.y*v.x; } friend double operator ^(point const& u,point const& v) { return u.x*v.x+u.y*v.y; } friend point operator *(double const& k,point const& v) { return point(k*v.x,k*v.y); } friend point operator /(point const& u,double const& k){ return point(u.x/k,u.y/k); } friend bool operator < (point const& u,point const& v) { if(dcmp(u.x-v.x) == 0) return dcmp(u.y-v.y)<0; return dcmp(u.x-v.x)<0; } friend bool operator == (point const& u,point const& v) { return (dcmp(u.x-v.x) == 0) && dcmp(u.y-v.y)==0; } friend int dots_online(point,point,point); }; int dots_online(point a,point b,point c){ return dcmp((a-c)*(b-c))==0; } typedef struct line{ point a,b; line() {} line(point a,point b): a(a),b(b) {} void make(point _a,point _b) {a=_a;b=_b;} void read() { a.read(),b.read(); } friend int intersection(line,line); } segment; int dot_in_line(point p,line l){ return dcmp((l.a-p)*(p-l.b))==0 && dcmp((l.a-p)^(p-l.b))>=0; } int sameside(point a,point b,line l){ return dcmp((l.a-a)*(a-l.b)) * dcmp((l.a-b)*(b-l.b)) > 0; } int intersection(line u,line v){ if(dots_online(u.a,u.b,v.a) && dots_online(u.a,u.b,v.b)) return dot_in_line(u.a,v) || dot_in_line(u.b,v) || dot_in_line(v.a,u) || dot_in_line(v.a,u); else return !sameside(u.a,u.b,v) && !sameside(v.a,v.b,u); } line l,s[4]; point p1,p2,p3,p4; int n; double x1,x2,yy1,y2; int inside(point a,point p1,point p2){ return a.x>=p1.x&&a.x<=p2.x&&a.y>=p2.y&&a.y<=p1.y; } int main(){ #ifndef ONLINE_JUDGE freopen("input.txt","r",stdin); #endif scanf("%d",&n); while(n--){ l.read();cin>>x1>>yy1>>x2>>y2; if(x1>x2) swap(x1,x2); if(yy1>y2) swap(yy1,y2); p1.make(x1,yy1); p2.make(x1,y2); p3.make(x2,y2); p4.make(x2,yy1); s[0].make(p1,p2),s[1].make(p2,p3),s[2].make(p3,p4),s[3].make(p4,p1); int ok=1; for(int i=0;i<4;i++) if(intersection(l,s[i]) || inside(l.a,p2,p4)) {ok=0;break;} printf("%s\n",ok?"F":"T"); } return 0; }
相关文章推荐
- poj 1410 Intersection(线段与矩形相交)
- POJ 1410 Intersection
- POJ 1410 Intersection 笔记
- POJ 1410 Intersection (判断线段是否与矩形相交)
- poj 1410 Intersection
- poj1410 - Intersection
- POJ 1410 || Intersection(线段矩形相交
- poj 1410 Intersection
- POJ 1410 Intersection(一线段是否与矩阵相交)
- poj 1410 Intersection 【判断线段 与矩形面是否相交】
- POJ 1410 Intersection 判断矩形和线段相交
- poj 1410 Intersection
- POJ 1410 Intersection --几何,线段相交
- poj1410 Intersection 线段与矩形相交
- POJ 1410 Intersection(判断线段交和点在矩形内)
- poj 1410 Intersection
- POJ 1410 Intersection --几何,线段相交
- 线段覆盖POJ1410 Intersection
- POJ 1410 Intersection
- POJ 1410 Intersection