zoukankan      html  css  js  c++  java
  • POJ 3335 Rotating Scoreboard

    POJ_3335

        这个题目是我写的第一个半平面交的题目,之前总以为半平面交是个很高深的东西,但实际上真正去接触它时才发现它其实也并不复杂,搞ACM的过程中很多时候都是这样,因为自己的畏怯而不敢去接触一类新的算法、题目,算是又跨过了一个小门槛,继续努力啦!

        对于半平面交的一些简明扼要的介绍可以参考这篇博客:http://blog.csdn.net/accry/article/details/6070621。此外,这篇博客上介绍的还有我敲出的程序都只是比较好理解的O(n^2)的求半平面交的算法,对于O(nlogn)的算法可以参考朱泽园的论文。

    #include<stdio.h>
    #include<string.h>
    #define zero 1e-8
    #define MAXD 310
    #define INF 0x3f3f3f3f
    struct point
    {
    double x, y;
    }p[MAXD], wa[MAXD], wb[MAXD], *a, *b;
    int N, P, na, nb;
    double fabs(double x)
    {
    return x < 0 ? -x : x;
    }
    int dcmp(double x)
    {
    return fabs(x) < zero ? 0 : (x < 0 ? -1 : 1);
    }
    double det(double x1, double y1, double x2, double y2)
    {
    return x1 * y2 - x2 * y1;
    }
    void anticlock()
    {
    int i, j, k;
    double s = 0;
    point t;
    for(i = 0; i < N; i ++)
    s += det(p[i].x, p[i].y, p[i + 1].x, p[i + 1].y);
    if(dcmp(s) < 0)
    {
    for(i = 1; i <= N - i; i ++)
    t = p[i], p[i] = p[N - i], p[N - i] = t;
    }
    }
    void init()
    {
    int i, j, k;
    scanf("%d", &N);
    for(i = 0; i < N; i ++)
    scanf("%lf%lf", &p[i].x, &p[i].y);
    p[N] = p[0];
    anticlock();
    }
    void add(double x, double y)
    {
    b[nb].x = x, b[nb].y = y;
    ++ nb;
    }
    void cut(int k)
    {
    int i, j, nt;
    double t1, t2, x, y;
    point *t;
    nb = 0;
    for(i = 0; i < na; i ++)
    {
    t1 = det(p[k + 1].x - p[k].x, p[k + 1].y - p[k].y, a[i].x - p[k].x, a[i].y - p[k].y);
    t2 = det(p[k + 1].x - p[k].x, p[k + 1].y - p[k].y, a[i + 1].x - p[k].x, a[i + 1].y - p[k].y);
    if(dcmp(t1) >= 0)
    add(a[i].x, a[i].y);
    if(dcmp(t1) * dcmp(t2) < 0)
    {
    x = (fabs(t2) * a[i].x + fabs(t1) * a[i + 1].x) / (fabs(t1) + fabs(t2));
    y = (fabs(t2) * a[i].y + fabs(t1) * a[i + 1].y) / (fabs(t1) + fabs(t2));
    add(x, y);
    }
    }
    t = a, a = b, b = t;
    nt = na, na = nb, nb = nt;
    a[na] = a[0];
    }
    void solve()
    {
    int i, j, k;
    a = wa, b = wb;
    na = 4;
    a[0].x = -INF, a[0].y = -INF, a[1].x = INF, a[1].y = -INF, a[2].x = INF, a[2].y = INF, a[3].x = -INF, a[3].y = INF;
    a[na] = a[0];
    for(i = 0; i < N; i ++)
    cut(i);
    if(na == 0)
    printf("NO\n");
    else
    printf("YES\n");
    }
    int main()
    {
    int t;
    scanf("%d", &t);
    while(t --)
    {
    init();
    solve();
    }
    return 0;
    }


  • 相关阅读:
    linux 短信收发
    sama5d3 环境检测 adc测试
    【Codeforces 723C】Polycarp at the Radio 贪心
    【Codeforces 723B】Text Document Analysis 模拟
    【USACO 2.2】Preface Numbering (找规律)
    【Codeforces 722C】Destroying Array (数据结构、set)
    【USACO 2.1】Hamming Codes
    【USACO 2.1】Healthy Holsteins
    【USACO 2.1】Sorting A Three-Valued Sequence
    【USACO 2.1】Ordered Fractions
  • 原文地址:https://www.cnblogs.com/staginner/p/2358256.html
Copyright © 2011-2022 走看看