[Poj-1066] Analyzing intersects the line segment

Topic links: https://vjudge.net/problem/POJ-1066

Meaning of the questions: give some straight line and straight line segments are cut fence, only through the middle of the wall, and asked at least through the layers of the wall to reach the finish line

Read hzwer, I feel good sense, although that is the midpoint, but in fact directly ask each endpoint on ok

 1 /*************************************************************************
 2     > File Name: poj1066.cpp
 3 # File Name: poj1066.cpp
 4 # Author : xiaobuxie
 5 # QQ : 760427180
 6 # Email:[email protected]
 7 # Created Time: 2019年09月21日 星期六 15时11分27秒
 8  ************************************************************************/
 9 
10 #include<iostream>
11 #include<cstdio>
12 #include<map>
13 #include<cmath>
14 #include<cstring>
15 #include<set>
16 #include<queue>
17 #include<vector>
18 #include<algorithm>
19 using namespace std;
20 typedef long long ll;
21 #define inf 0x3f3f3f3f
22 #define pq priority_queue<int,vector<int>,greater<int> >
23 const double eps = 1e-8;
24 const int N=50;
25 int sgn(double x){ 
26     if(fabs(x)<eps) return 0;
27     if(x<0) return -1;
28     return 1;
29 }
30 struct Point{
31     double x,y;
32     Point operator - (const Point& b)const{
33         return (Point){x-b.x,y-b.y};
34     }
35     double operator ^ (const Point& b)const{
36         return x*b.y-b.x*y;
37     }
38 }P[N<<2];
39 struct Line{
40     Point s,e;
41 }L[N];
42 bool inter(Line l1,Line l2){
43     return 
44         max(l1.s.x,l1.e.x) >= min(l2.s.x,l2.e.x) &&
45         max(l2.s.x,l2.e.x) >= min(l1.s.x,l1.e.x) &&
46         max(l1.s.y,l1.e.y) >= min(l2.s.y,l2.e.y) &&
47         max(l2.s.y,l2.e.y) >= min(l1.s.y,l1.e.y) &&
48         sgn((l2.s-l1.s)^(l1.e-l1.s))*sgn((l2.e-l1.s)^(l1.e-l1.s)) <= 0 &&
49         sgn((l1.s-l2.s)^(l2.e-l1.s))*sgn((l1.e-l2.s)^(l2.e-l2.s)) <= 0;
50 }
51 int main(){
52     int n; scanf("%d",&n);
53     if(!n){
54         printf("Number of doors = 1");
55         return 0;
56     }
57     double x1,x2,y1,y2,ex,ey;
58     for(int i=1;i<=n;++i){
59         scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
60         L[i]=(Line){(Point){x1,y1},(Point){x2,y2}};
61         P[i*2]=(Point){x1,y1}; P[i*2-1]=(Point){x2,y2};
62     }
63     scanf("%lf %lf",&ex,&ey);
64     Point ed=(Point){ex,ey};
65     int ans=10000000;
66     for(int i=1;i<=2*n;++i){
67         Line l1=(Line){ed,P[i]};
68         int tem=0;
69         for(int j=1;j<=n;++j){
70             if(i==2*j || i==2*j-1) continue;
71             if(inter(l1,L[j])) ++tem;
72         }
73         ans=min(ans,tem);
74         //cerr<<ans<<endl;
75     }
76     //cerr<<ans<<endl;
77     printf("Number of doors = %d",ans+1);
78     return 0;
79 }
View Code

 

Guess you like

Origin www.cnblogs.com/xiaobuxie/p/11564268.html