题意:
求从目标点走矩形框至少要穿越多少条边。
题解:
从矩形框上穿出等价于从直线与矩形框的顶点穿出。
矩形框四个角特判!
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 }