• 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
  • 相关阅读:
    (一)Python装饰器的通俗理解
    Linux实例安装VNC Server实现图形化访问
    TightVNC for Windows
    使用Xmanager远程CentOS 7服务器(XDMCP)
    Using Xmanager to connect to remote CentOS 7 via XDMCP
    在windows上使用xdmcp登陆centos,红帽linux
    Xmanger远程连接Centos7(成功配置)
    Centos7.2命令安装图形化界面
    CentOS 7安装图形界面
    CentOS 7命令行安装GNOME、KDE图形界面(成功安装验证)
  • 原文地址:https://www.cnblogs.com/shangyu/p/3273382.html
Copyright © 2020-2023  润新知