USACO3.41Closed Fences(几何)

这题水的真不易。。300多行 累死了 对着数据查错啊 

枚举每个边上的点到源点 是否中间隔着别的边  每条边划分500份就够了  注意一下与源点在一条直线上的边不算

几何 啊,,好繁琐 参考各种模版。。

  1 /*
  2     ID: shangca2
  3     LANG: C++
  4     TASK: fence4
  5  */
  6 #include <iostream>
  7 #include<cstdio>
  8 #include<cstring>
  9 #include<algorithm>
 10 #include<stdlib.h>
 11 #include<cmath>
 12 using namespace std;
 13 typedef struct  pointt
 14 {
 15     double x,y;
 16     pointt(double x=0,double y=0):x(x),y(y){}
 17 }vec;
 18 struct node
 19 {
 20     int x1,y1,x2,y2,o1,o2;
 21 }po[210];
 22 vec p,pp[210],q[4010];
 23 int e,n;
 24 vec operator + (vec a,vec b){return vec(a.x+b.x,a.y+b.y);}
 25 vec operator - (pointt a,pointt b){return vec(a.x-b.x,a.y-b.y);}
 26 vec operator * (vec a,double b){return vec(a.x*b,a.y*b);}
 27 vec operator / (vec a,double b){return vec(a.x/b,a.y/b);}
 28 bool operator < (const pointt &a,const pointt &b)
 29 {
 30     return a.x<b.x||(a.x==b.x&&a.y<b.y);
 31 }
 32 const double eps = 1e-15;
 33 int dcmp(double x)
 34 {
 35     if(fabs(x)<eps) return 0;
 36     else return x<0?-1:1;
 37 }
 38 bool operator == (const pointt &a,const pointt &b)
 39 {
 40     return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
 41 }
 42 double dot(vec a,vec b)
 43 {
 44     return a.x*b.x+a.y*b.y;
 45 }
 46 double cross(vec a,vec b)
 47 {
 48     return a.x*b.y-a.y*b.x;
 49 }
 50 bool segprointer(pointt a1,pointt a2,pointt b1,pointt b2)
 51 {
 52     double c1 = cross(a2-a1,b1-a1),c2 = cross(a2-a1,b2-a1),
 53            c3 = cross(b2-b1,a1-b1),c4 = cross(b2-b1,a2-b1);
 54     return dcmp(c1)*dcmp(c2)<0&&dcmp(c3)*dcmp(c4)<0;
 55 }
 56 bool cmp(node a,node b)
 57 {
 58     if(a.o2==b.o2)
 59     return a.o1<b.o1;
 60     return a.o2<b.o2;
 61 }
 62 int judge(int i,int j)
 63 {
 64     int g;
 65 
 66     for(g = 1; g <= n ; g++)
 67     {
 68         if(g==i)
 69         continue;
 70         if(segprointer(q[j],p,pp[g],pp[g+1]))
 71             break;
 72     }
 73     if(g==n+1)
 74     {
 75         e++;
 76         if(i==n)
 77         {
 78             po[e].x1 = pp[i+1].x;
 79             po[e].y1 = pp[i+1].y;
 80             po[e].x2 = pp[i].x;
 81             po[e].y2 = pp[i].y;
 82             po[e].o1 = 1;
 83             po[e].o2 = i;
 84         }
 85         else
 86         {
 87             po[e].o1 = i;
 88             po[e].o2 = i+1;
 89             po[e].x1 = pp[i].x;
 90             po[e].y1 = pp[i].y;
 91             po[e].x2 = pp[i+1].x;
 92             po[e].y2 = pp[i+1].y;
 93         }
 94         return 1;
 95     }
 96     return 0;
 97 }
 98 double xmult(vec p1,vec p2,vec p3)
 99 {
100     return (p1.x-p3.x)*(p2.y-p3.y)-(p2.x-p3.x)*(p1.y-p3.y);
101 }
102 int dots(vec p1,vec p2,vec p3)
103 {
104     return dcmp(xmult(p1,p2,p3));
105 }
106 int main()
107 {
108     freopen("fence4.in","r",stdin);
109     freopen("fence4.out","w",stdout);
110     int i,j,o,g;
111     cin>>n;
112     cin>>p.x>>p.y;
113     for(i = 1 ;i <= n ; i++)
114     cin>>pp[i].x>>pp[i].y;
115     pp[n+1] = pp[1];
116     for(i = 3; i <= n ; i++)
117     {
118         for(j = 1; j <= i-3 ; j++)
119         {
120             if(i==n&&j==1)
121             continue;
122             if(segprointer(pp[i],pp[i+1],pp[j],pp[j+1]))
123             {
124                 puts("NOFENCE");
125                 return 0;
126             }
127         }
128     }
129     vec no;
130     for(i = 1; i <= n ; i++)
131     {
132         if(!dots(p,pp[i],pp[i+1]))
133         continue;
134         o = 0;
135         int fo=0;
136         if(pp[i+1].x==pp[i].x)
137         {
138             double x1 = pp[i].x;
139             double y1;
140             if(pp[i].y<pp[i+1].y)
141             {
142                 double xx = (pp[i+1].y-pp[i].y)/300.0;
143                 y1 = pp[i].y+xx;
144                 while(y1<pp[i+1].y)
145                 {
146                     o++;
147                     q[o].x = x1;
148                     q[o].y = y1;
149                     if(judge(i,o))
150                     {
151                         fo = 1;
152                         break;
153                     }
154                     y1+=xx;
155                 }
156             }
157             else
158             {
159                 double xx = (pp[i].y-pp[i+1].y)/300.0;
160                 y1 = pp[i].y-xx;
161                 while(y1>pp[i+1].y)
162                 {
163                     o++;
164                     q[o].x = x1;
165                     q[o].y = y1;
166                     if(judge(i,o))
167                     {
168                         fo = 1;
169                         break;
170                     }
171                     y1-=xx;
172                 }
173             }
174         }
175         else if(pp[i+1].y==pp[i].y)
176         {
177 
178             double x1;
179             double y1=pp[i].y;
180             if(pp[i+1].x>pp[i].x)
181             {
182                 double xx = (pp[i+1].x-pp[i].x)/500.0;
183                 x1 = pp[i].x+xx;
184                 while(x1<pp[i+1].x)
185                 {
186                     o++;
187                     q[o].x = x1;
188                     q[o].y = y1;
189                     if(judge(i,o))
190                     {
191                         fo = 1;
192                         break;
193                     }
194                     x1+=xx;
195                 }
196             }
197             else
198             {
199                 double xx = (pp[i].x-pp[i+1].x)/500.0;
200                 x1 = pp[i].x-xx;
201                 while(x1>pp[i+1].x)
202                 {
203                     o++;
204                     q[o].x = x1;
205                     q[o].y = y1;
206                     if(judge(i,o))
207                     {
208                         fo = 1;
209                         if(i==7)
210                         cout<<x1<<" "<<y1<<endl;
211                         break;
212                     }
213                     x1-=xx;
214                 }
215             }
216         }
217         else
218         {
219             double d = (pp[i+1].y-pp[i].y)/(pp[i+1].x-pp[i].x);
220             double  k1,x1,y1;
221             double xx = fabs((pp[i+1].x-pp[i].x)/500.0);
222             k1 = 1.0*fabs(d);
223             if(pp[i+1].x>pp[i].x&&pp[i+1].y>pp[i].y)
224             {
225                 x1 = pp[i].x+0.1;
226                 y1 = pp[i].y+0.1*k1;
227                 while(x1<pp[i+1].x&&y1<pp[i+1].y)
228                 {
229                     o++;
230                     q[o].x = x1;
231                     q[o].y = y1;
232                     if(judge(i,o))
233                     {
234                         fo = 1;
235                         break;
236                     }
237                     x1+=xx;
238                     y1+=xx*k1;
239                 }
240             }
241             else if(pp[i+1].x<pp[i].x&&pp[i+1].y>pp[i].y)
242             {
243                 x1 = pp[i].x-0.1;
244                 y1 = pp[i].y+0.1*k1;
245                 while(x1>pp[i+1].x&&y1<pp[i+1].y)
246                 {
247                     o++;
248                     q[o].x = x1;
249                     q[o].y = y1;
250                     if(judge(i,o))
251                     {
252                         fo = 1;
253                         break;
254                     }
255                     x1-=xx;
256                     y1+=xx*k1;
257                 }
258             }
259             else if(pp[i+1].x<pp[i].x&&pp[i+1].y<pp[i].y)
260             {
261                 x1 = pp[i].x-0.1;
262                 y1 = pp[i].y-0.1*k1;
263                 while(x1>pp[i+1].x&&y1>pp[i+1].y)
264                 {
265                     o++;
266                     q[o].x = x1;
267                     q[o].y = y1;
268                     if(judge(i,o))
269                     {
270                         fo = 1;
271                         break;
272                     }
273                     x1-=xx;
274                     y1-=xx*k1;
275                 }
276             }
277             else
278             {
279                 x1 = pp[i].x+0.1;
280                 y1 = pp[i].y-0.1*k1;
281                 while(x1<pp[i+1].x&&y1>pp[i+1].y)
282                 {
283                     o++;
284                     q[o].x = x1;
285                     q[o].y = y1;
286                     if(judge(i,o))
287                     {
288                         fo = 1;
289                         break;
290                     }
291                     x1+=xx;
292                     y1-=xx*k1;
293                 }
294             }
295         }
296     }
297     sort(po+1,po+e+1,cmp);
298     cout<<e<<endl;
299     for(i = 1; i <= e ; i++)
300     {
301         cout<<po[i].x1<<" "<<po[i].y1<<" "<<po[i].x2<<" "<<po[i].y2<<endl;
302     }
303     return 0;
304 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3273382.html