poj 1066 Treasure Hunt

http://poj.org/problem?id=1066

  1 #include <cstdio>

  2 #include <cstring>

  3 #include <cmath>

  4 #include <cstdlib>

  5 #include <algorithm>

  6 #define maxn 500000

  7 using namespace std;

  8 

  9 const double eps=1e-10;

 10 const int inf=1<<30;

 11 int t1,t2,t3,t4,t5,c;

 12 

 13 int cmp(double x)

 14 {

 15     if(fabs(x)<eps) return 0;

 16     if(x>0) return 1;

 17     return -1;

 18 }

 19 

 20 struct point

 21 {

 22     double x,y;

 23     point() {}

 24     point(double a,double b):x(a),y(b) {}

 25     friend point operator -(const point &a,const point &b)

 26     {

 27         return point(a.x-b.x,a.y-b.y);

 28     }

 29     friend point operator *(const point &a,const double &b)

 30     {

 31         return point(a.x*b,a.y*b);

 32     }

 33     friend point operator /(const point &a,const double &b)

 34     {

 35         return point(a.x/b,a.y/b);

 36     }

 37 } p[maxn];

 38 point m[4][500000];

 39 

 40 int cmp1(const point &a,const point &b)

 41 {

 42     return a.x<b.x;

 43 }

 44 

 45 int cmp2(const point &a,const point &b)

 46 {

 47     return a.y<b.y;

 48 }

 49 

 50 struct line

 51 {

 52     point a,b;

 53     line() {}

 54     line(point x,point y):a(x),b(y) {};

 55 } ll[maxn];

 56 

 57 double det(const point &a,const point &b)

 58 {

 59     return a.x*b.y-a.y*b.x;

 60 }

 61 

 62 bool segment(point a1,point a2,point b1,point b2)

 63 {

 64     double c1=det(a2-a1,b1-a1),c2=det(a2-a1,b2-a1);

 65     double c3=det(b2-b1,a1-b1),c4=det(b2-b1,a2-b1);

 66     return cmp(c1)*cmp(c2)<0&&cmp(c3)*cmp(c4)<0;

 67 }

 68 

 69 void make(double x,double y)

 70 {

 71     if(y==0)

 72     {

 73         m[0][t1].x=x;

 74         m[0][t1++].y=y;

 75     }

 76     else if(y==100)

 77     {

 78         m[1][t2].x=x;

 79         m[1][t2++].y=y;

 80     }

 81     else if(x==100)

 82     {

 83         m[2][t3].x=x;

 84         m[2][t3++].y=y;

 85     }

 86     else if(x==0)

 87     {

 88         m[3][t4].x=x;

 89         m[3][t4++].y=y;

 90     }

 91 }

 92 

 93 void inti()

 94 {

 95     for(int i=1; i<=t1; i++)

 96     {

 97         p[c].x=(m[0][i].x+m[0][i-1].x)/2;

 98         p[c++].y=0;

 99     }

100     for(int i=1; i<=t3; i++)

101     {

102         p[c].y=(m[2][i].y+m[2][i-1].y)/2;

103         p[c++].x=100;

104     }

105     for(int i=1; i<=t2; i++)

106     {

107         p[c].x=(m[1][i].x+m[1][i-1].x)/2;

108         p[c++].y=100;

109     }

110     for(int i=1; i<=t4; i++)

111     {

112         p[c].y=(m[3][i].y+m[3][i-1].y)/2;

113         p[c++].x=0;

114     }

115 }

116 int main()

117 {

118     int T;

119     while(scanf("%d",&T)!=EOF)

120     {

121         int n=T;

122         double x1,y1,x2,y2;

123         t1=1,t2=1,t3=1,t4=1,t5=0;

124         c=0;

125         while(T--)

126         {

127             scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);

128             make(x1,y1);

129             make(x2,y2);

130             point st(x1,y1);

131             point st1(x2,y2);

132             ll[t5].a=st;

133             ll[t5++].b=st1;

134         }

135         m[0][0].x=0;

136         m[0][0].y=0;

137         m[0][t1].x=100;

138         m[0][t1].y=0;

139         m[2][t3].x=100;

140         m[2][t3].y=100;

141         m[2][0].x=100;

142         m[2][0].y=0;

143         m[1][0].x=0;

144         m[1][0].y=100;

145         m[1][t2].x=100;

146         m[1][t2].y=100;

147         m[3][0].x=0;

148         m[3][0].y=0;

149         m[3][t4].x=0;

150         m[3][t4].y=100;

151         sort(m[0],m[0]+t1+1,cmp1);

152         sort(m[1],m[1]+t2+1,cmp1);

153         sort(m[2],m[2]+t3+1,cmp2);

154         sort(m[3],m[3]+t4+1,cmp2);

155         inti();

156         point pp,p1;

157         scanf("%lf%lf",&pp.x,&pp.y);

158         int ans=inf;

159         for(int i=0; i<c; i++)

160         {

161             line l1(p[i],pp);

162             int ans1=0;

163             for(int j=0; j<t5; j++)

164             {

165                 if(segment(l1.a,l1.b,ll[j].a,ll[j].b)) ans1++;

166             }

167             ans=min(ans,ans1);

168         }

169         if(n==0)

170         {

171             ans=0;

172         }

173         printf("Number of doors = %d\n",ans+1);

174     }

175     return 0;

176 }
View Code

 

你可能感兴趣的:(poj)