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;
    }


  • 相关阅读:
    关于lockkeyword
    关于多层for循环迭代的效率优化问题
    Android 面试精华题目总结
    Linux基础回想(1)——Linux系统概述
    linux源代码编译安装OpenCV
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem B. Matrix Fast Power
    校赛热身 Problem B. Matrix Fast Power
    集合的划分(递推)
  • 原文地址:https://www.cnblogs.com/staginner/p/2358256.html
Copyright © 2011-2022 走看看