zoukankan      html  css  js  c++  java
  • poj 3335(半平面交)

    链接:http://poj.org/problem?id=3335     //大牛们常说的测模板题

    ----------------------------------------------------------------

    Rotating Scoreboard
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 5158   Accepted: 2061

    Description

    This year, ACM/ICPC World finals will be held in a hall in form of a simple polygon. The coaches and spectators are seated along the edges of the polygon. We want to place a rotating scoreboard somewhere in the hall such that a spectator sitting anywhere on the boundary of the hall can view the scoreboard (i.e., his line of sight is not blocked by a wall). Note that if the line of sight of a spectator is tangent to the polygon boundary (either in a vertex or in an edge), he can still view the scoreboard. You may view spectator's seats as points along the boundary of the simple polygon, and consider the scoreboard as a point as well. Your program is given the corners of the hall (the vertices of the polygon), and must check if there is a location for the scoreboard (a point inside the polygon) such that the scoreboard can be viewed from any point on the edges of the polygon.

    Input

    The first number in the input line, T is the number of test cases. Each test case is specified on a single line of input in the form n x1 y1 x2 y2 ... xn yn where n (3 ≤ n ≤ 100) is the number of vertices in the polygon, and the pair of integers xi yi sequence specify the vertices of the polygon sorted in order.

    Output

    The output contains T lines, each corresponding to an input test case in that order. The output line contains either YES or NO depending on whether the scoreboard can be placed inside the hall conforming to the problem conditions.

    Sample Input

    2
    4 0 0 0 1 1 1 1 0
    8 0 0  0 2  1 2  1 1  2 1  2 2  3 2  3 0
    

    Sample Output

    YES
    NO
    

    Source

     
     
     
    -----------------------------------------------------------------------------------
    看了N久,感觉好难
    分别看了这里:http://blog.csdn.net/dream_ysl/article/details/7831293
               这里:http://blog.csdn.net/zxy_snow/article/details/6596237
               这里:http://blog.csdn.net/accry/article/details/6070621
    一直引用大牛zxy_snow的模板,希望大牛别生气啊
     
    个人觉得半平面交确实要花好多功夫,
    一要理解N^2的是求如何出来的                       //用给定的多边形每一条边去切割它自己
    二要判断给定的点是逆时针or顺时针,要加判断    //用连向原点的面积正负判断
    三要理解代码,每一次切割过后的边数要更新,给下一个循环
    四要自己在草稿纸上画画,一定理解了才去做题(测模板)
    -----------------------------------------------------------------------------------
     
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 #include <iostream>
     5 #include <algorithm>
     6 #include <math.h>
     7 
     8 using namespace std;
     9 
    10 #define eps 1e-8
    11 #define MAXX 105
    12 typedef struct
    13 {
    14     double x;
    15     double y;
    16 }point;
    17 
    18 point p[MAXX],s[MAXX];
    19 
    20 bool dy(double x,double y) {return x>y+eps; }
    21 bool xy(double x,double y) {return x<y-eps; }
    22 bool dyd(double x,double y){return x>y-eps; }
    23 bool xyd(double x,double y){return x<y+eps; }
    24 bool dd(double x,double y) {return fabs(x-y)<eps; }
    25 
    26 double crossProduct(point a,point b,point c)
    27 {
    28     return (c.x-a.x)*(b.y-a.y)-(c.y-a.y)*(b.x-a.x);
    29 }
    30 
    31 point IntersectPoint(point u1,point u2,point v1,point v2)
    32 {
    33     point ans=u1;
    34     double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/
    35              ((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
    36     ans.x += (u2.x-u1.x)*t;
    37     ans.y += (u2.y-u1.y)*t;
    38     return ans;
    39 }
    40 
    41 void cut(point p[],point s[],int n,int &len)
    42 {
    43     point tp[MAXX];
    44     p[n]=p[0];
    45     for(int i=0; i<=n; i++)
    46     {
    47         tp[i]=p[i];
    48     }
    49     int cp=n,tc;
    50     for(int i=0; i<n; i++)
    51     {
    52         tc=0;
    53         for(int k=0; k<cp; k++)
    54         {
    55             if(dyd(crossProduct(p[i],p[i+1],tp[k]),0.0))
    56                 s[tc++]=tp[k];
    57             if(xy(crossProduct(p[i],p[i+1],tp[k])*
    58                   crossProduct(p[i],p[i+1],tp[k+1]),0.0))
    59                 s[tc++]=IntersectPoint(p[i],p[i+1],tp[k],tp[k+1]);
    60         }
    61         s[tc]=s[0];
    62         for(int k=0; k<=tc; k++)
    63             tp[k]=s[k];
    64         cp=tc;
    65     }
    66     len=cp;
    67 }
    68 
    69 int main()
    70 {
    71     int n,m,i,j;
    72     scanf("%d",&n);
    73     while(n--)
    74     {
    75         scanf("%d",&m);
    76         for(i=0; i<m; i++)
    77             scanf("%lf%lf",&p[i].x,&p[i].y);
    78             int len;
    79             cut(p,s,m,len);
    80         if(len)printf("YES
    ");
    81         else printf("NO
    ");
    82     }
    83     return 0;
    84 }
    View Code
  • 相关阅读:
    团队项目冲刺第五天
    团队项目冲刺第四天
    团队项目冲刺第三天
    团队项目冲刺第二天
    团队项目冲刺第一天
    团队任务命题
    java报错the superclass was not found 解决方案
    Buildings 分类: ACM 多校 2015-07-23 22:09
    1009 数字1的数量 分类: 51nod 2015-07-20 21:44 3人阅读 评
    1284 2 3 5 7的倍数 分类: 51nod 2015-07-18 22:06 6人阅读
  • 原文地址:https://www.cnblogs.com/ccccnzb/p/3940370.html
Copyright © 2011-2022 走看看