zoukankan      html  css  js  c++  java
  • POJ 2653 Pick-up sticks(计算几何 求线段交点)

    POJ 2653

    题意:题意很简单,就是在地上按顺序撒一对木棒,看最后有多少是被压住的,输出没有被压住的木棒的序号。有点坑的就是没说清楚木棒怎么算压住,也不知道是不是规范相交。。。我就判断了一下包括端点重合跟部分相交的。

    思路:一开始我想的是从后往前遍历,找到每一条边,看他是不是压到之前的边了,如果压到了,就把之前的变标记一下,最后统计没被标记过的,但是TLE了。。。就只能从前面开始找,遍历每一条边是否被后面的压过了,压过了就直接break,如果都没压到,存这条边,最后输出。

     1 int n;
     2 
     3 struct point
     4 {
     5     double x, y;
     6 } ;
     7 
     8 struct line
     9 {
    10     point a, b;
    11 } L[100010];
    12 
    13 int Ans[100010];
    14 
    15 double xmult(point p1, point p2, point p)
    16 {
    17     return (p1.x-p.x)*(p2.y-p.y) - (p2.x-p.x)*(p1.y-p.y);
    18 }
    19 
    20 ///判三点共线
    21 int dots_inline(point p1,point p2,point p3)
    22 {
    23     return zero(xmult(p1,p2,p3));
    24 }
    25 
    26 ///判两点在线段同侧,点在线段上返回0
    27 int same_side(point p1,point p2,line l)
    28 {
    29     return xmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)>eps;
    30 }
    31 
    32 ///判点是否在线段上,包括端点
    33 int dot_online_in(point p,line l)
    34 {
    35     return zero(xmult(p,l.a,l.b))&&(l.a.x-p.x)*(l.b.x-p.x)<eps&&(l.a.y-p.y)*(l.b.y-p.y)<eps;
    36 }
    37 
    38 ///判两线段相交,包括端点和部分重合
    39 int intersect_in(line u,line v)
    40 {
    41     if (!dots_inline(u.a,u.b,v.a)||!dots_inline(u.a,u.b,v.b))
    42         return !same_side(u.a,u.b,v)&&!same_side(v.a,v.b,u);
    43     return dot_online_in(u.a,v)||dot_online_in(u.b,v)||dot_online_in(v.a,u)||dot_online_in(v.b,u);
    44 }
    45 
    46 void Solve()
    47 {
    48     while(~scanf("%d", &n) && n)
    49     {
    50         for(int i = 0; i < n; ++i)
    51         {
    52             scanf("%lf%lf%lf%lf", &L[i].a.x, &L[i].a.y, &L[i].b.x, &L[i].b.y);
    53         }
    54         int t = 0;
    55         for(int i = 0; i < n; ++i)
    56         {
    57             bool flag = true;
    58             for(int j = i+1; j < n; ++j)
    59             {
    60                 if(intersect_in(L[i], L[j]))
    61                 {
    62                     flag = false;
    63                     break;
    64                 }
    65             }
    66             if(flag)
    67             {
    68                 Ans[t++] = i+1;
    69             }
    70         }
    71         printf("Top sticks:");
    72         for(int i = 0; i < t-1; ++i)
    73         {
    74             printf(" %d,", Ans[i]);
    75         }
    76         printf(" %d.
    ", n);
    77     }
    78 }
    View Code
  • 相关阅读:
    不可小视视图对效率的影响力
    Maximum Margin Planning
    PhysicsBased Boiling Simulation

    Learning Behavior Styles with Inverse Reinforcement Learning
    Simulating Biped Behaviors from Human Motion Data
    Nearoptimal Character Animation with Continuous Control
    Apprenticeship Learning via Inverse Reinforcement Learning
    回报函数学习的学徒学习综述
    Enabling Realtime Physics Simulation in Future Interactive Entertainment
  • 原文地址:https://www.cnblogs.com/Silence-AC/p/3656029.html
Copyright © 2011-2022 走看看