POJ 1066 计算几何 线段相交

题意:

求从目标点走矩形框至少要穿越多少条边。

题解:

从矩形框上穿出等价于从直线与矩形框的顶点穿出。

矩形框四个角特判!

View Code
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cstdio>
 5 #include <algorithm>
 6 
 7 #define N 10000
 8 #define EPS 1e-8
 9 
10 using namespace std;
11 
12 struct LI
13 {
14     double x,y;
15 }li[N][2],mi,co;
16 
17 int n,ans;
18 
19 inline void read()
20 {
21     for(int i=1;i<=n;i++)
22         scanf("%lf%lf%lf%lf",&li[i][0].x,&li[i][0].y,&li[i][1].x,&li[i][1].y);
23     scanf("%lf%lf",&mi.x,&mi.y);
24 }
25 
26 inline double cross(const LI &o,const LI &a,const LI &b)
27 {
28     double fx=a.x-o.x,fy=a.y-o.y,px=b.x-o.x,py=b.y-o.y;
29     return fx*py-fy*px;
30 }
31 
32 inline int judge(const LI &a1,const LI &a2,const LI &b1,const LI &b2)
33 {
34     double fg1=cross(a1,a2,b1)*cross(a1,a2,b2);
35     double fg2=cross(b1,b2,a1)*cross(b1,b2,a2);
36     if(fg1<EPS&&fg2<EPS) return 1;
37     return false;
38 }
39 
40 inline int check(int x,int p)
41 {
42     int num=0;
43     for(int i=1;i<=n;i++)
44         num+=judge(mi,li[x][p],li[i][0],li[i][1]);
45     return num;
46 }
47 
48 inline void prp()
49 {
50     int num;
51     num=1;
52     co.x=co.y=0.0;
53     for(int i=1;i<=n;i++)
54         num+=judge(mi,co,li[i][0],li[i][1]);
55     ans=min(ans,num);
56     
57     num=1;
58     co.x=co.y=100.0;
59     for(int i=1;i<=n;i++)
60         num+=judge(mi,co,li[i][0],li[i][1]);
61     ans=min(ans,num);
62     
63     num=1;
64     co.x=0.0;co.y=100.0;
65     for(int i=1;i<=n;i++)
66         num+=judge(mi,co,li[i][0],li[i][1]);
67     ans=min(ans,num);
68     
69     num=1;
70     co.x=100.0;co.y=0.0;
71     for(int i=1;i<=n;i++)
72         num+=judge(mi,co,li[i][0],li[i][1]);
73     ans=min(ans,num);
74 }
75 
76 inline void go()
77 {
78     ans=0x3f3f3f3f;
79     for(int i=1;i<=n;i++)
80         for(int j=0;j<=1;j++)
81             ans=min(ans,check(i,j));
82     prp();
83     printf("Number of doors = %d\n",ans);
84 }
85 
86 int main()
87 {
88     while(scanf("%d",&n)!=EOF) read(),go();
89     return 0;
90 }
原文地址:https://www.cnblogs.com/proverbs/p/2855580.html