线段相交 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
",ans);
128     }
129     return 0;
130 }
原文地址:https://www.cnblogs.com/ITUPC/p/5856830.html