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 }

 

 

你可能感兴趣的:(poj)