首页 > 代码库 > 线段相交 poj 1066

线段相交 poj 1066

  1 // 线段相交 poj 1066  2 // 思路:直接枚举每个端点和终点连成线段,判断和剩下的线段相交个数  3   4 // #include <bits/stdc++.h>  5 #include <iostream>  6 #include <cstdio>  7 #include <cstdlib>  8 #include <algorithm>  9 #include <vector> 10 #include <math.h> 11 using namespace std; 12 #define LL long long 13 typedef pair<int,int> pii; 14 const int inf = 0x3f3f3f3f; 15 const LL MOD =100000000LL; 16 const int N =110; 17 #define clc(a,b) memset(a,b,sizeof(a)) 18 const double eps = 1e-8; 19 void fre() {freopen("in.txt","r",stdin);} 20 void freout() {freopen("out.txt","w",stdout);} 21 inline int read() {int x=0,f=1;char ch=getchar();while(ch>9||ch<0) {if(ch==-) f=-1; ch=getchar();}while(ch>=0&&ch<=9) {x=x*10+ch-0;ch=getchar();}return x*f;} 22  23 int sgn(double x){ 24     if(fabs(x) < eps)return 0; 25     if(x < 0)return -1; 26     else return 1; 27 } 28 struct Point{ 29     double x,y; 30     Point(){} 31     Point(double _x,double _y){ 32         x = _x;y = _y; 33     } 34     Point operator -(const Point &b)const{ 35         return Point(x - b.x,y - b.y); 36     } 37     double operator ^(const Point &b)const{ 38         return x*b.y - y*b.x; 39     } 40     double operator *(const Point &b)const{ 41         return x*b.x + y*b.y; 42     } 43 }; 44  45 struct Line{ 46     Point s,e; 47     int inx; 48     Line(){} 49     Line(Point _s,Point _e){ 50         s=_s;e=_e; 51     } 52 }; 53  54 Line line[N]; 55 bool inter(Line l1,Line l2){ 56     return  57         max(l1.s.x,l1.e.x) >= min(l2.s.x,l2.e.x) && 58         max(l2.s.x,l2.e.x) >= min(l1.s.x,l1.e.x) && 59         max(l1.s.y,l1.e.y) >= min(l2.s.y,l2.e.y) && 60         max(l2.s.y,l2.e.y) >= min(l1.s.y,l1.e.y) && 61         sgn((l2.s-l1.s)^(l1.e-l1.s))*sgn((l2.e-l1.s)^(l1.e-l1.s)) <= 0 && 62         sgn((l1.s-l2.s)^(l2.e-l2.s))*sgn((l1.e-l2.s)^(l2.e-l2.s)) <= 0; 63 } 64  65 vector<Line> list; 66 bool cmp(Line l1,Line l2){ 67     return l1.inx<l2.inx; 68 } 69  70 Point p[110]; 71 int main(){ 72     int n; 73     while(~scanf("%d",&n)){ 74     for(int i=1;i<=n;i++){ 75         double x1,y1,x2,y2; 76         scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); 77         line[i]=Line(Point(x1,y1),Point(x2,y2)); 78         p[i*2-1]=Point(x1,y1); 79         p[i*2]=Point(x2,y2); 80     } 81     double x1,y1; 82     scanf("%lf%lf",&x1,&y1); 83     Point s=Point(x1,y1); 84     int ans=inf; 85     for(int i=1;i<=2*n;i++){ 86        int tem=0; 87        for(int j=1;j<=n;j++){ 88           if(inter(Line(s,p[i]),line[j])) 89             tem++; 90        } 91        ans=min(ans,tem); 92     } 93      94     Point p1; 95     p1=Point(0,0); 96     int tem=0; 97     for(int i=1;i<=n;i++){ 98         if(inter(Line(s,p1),line[i])) 99           tem++;100     }101     ans=min(ans,tem+1);102     103     p1=Point(0,100);104     tem=0;105     for(int i=1;i<=n;i++){106         if(inter(Line(s,p1),line[i]))107           tem++;108     }109     ans=min(ans,tem+1);110 111     p1=Point(100,0);112      tem=0;113     for(int i=1;i<=n;i++){114         if(inter(Line(s,p1),line[i]))115           tem++;116     }117     ans=min(ans,tem+1);118 119     p1=Point(100,100);120     tem=0;121     for(int i=1;i<=n;i++){122         if(inter(Line(s,p1),line[i]))123           tem++;124     }125     ans=min(ans,tem+1);126     printf("Number of doors = ");127     printf("%d\n",ans);128     }129     return 0;130 }

 

线段相交 poj 1066