栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3677 Paint Erased

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3677 Paint Erased

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#define db doubleusing namespace std;const int N = 1005;const int M = 105;const db eps = 1e-8;int sgn(db t){    return t < -eps ? -1 : t > eps;}struct P{    db x, y;    P (db _x = 0, db _y = 0): x(_x), y(_y) {}    void input()    {        scanf("%lf%lf", &x, &y);    }    P operator - (const P &t) const    {        return P(x - t.x, y - t.y);    }    db len2()    {        return x * x + y * y;    }    db len()    {        return sqrt(len2());    }    bool operator == (const P &t) const    {        return sgn(x - t.x) == 0 && sgn(y - t.y) == 0;    }    bool operator < (const P &t) const    {        return x < t.x || (sgn(x - t.x) == 0 && y < t.y);    }    db operator ^ (const P &t) const    {        return x * t.y - t.x * y;    }    P operator * (const db &t) const    {        return P(x * t, y * t);    }    P operator + (const P &t) const    {        return P(x + t.x, y + t.y);    }} p[M], c[5];struct Rect{    int ch;    P a, b;    void input()    {        scanf("%d", &ch);        a.input();        b.input();    }    bool in(const P &t) const    {        if(t.x > a.x - eps && t.x < b.x + eps && t.y > a.y - eps && t.y < b.y + eps) return true;        return false;    }} r[N];struct Line{    P s, e;    Line() {}    Line(P _s, P _e)    {        s = _s;        e = _e;    }    P operator & (const Line &b) const    {        P res = s;        db t = ((s - b.s) ^ (b.s - b.e)) / ((s - e) ^ (b.s - b.e));        res.x += (e.x - s.x) * t;        res.y += (e.y - s.y) * t;        return res;    }};bool inter(Line l1, Line l2){    return        max(l1.s.x, l1.e.x) >= min(l2.s.x, l2.e.x) &&        max(l2.s.x, l2.e.x) >= min(l1.s.x, l1.e.x) &&        max(l1.s.y, l1.e.y) >= min(l2.s.y, l2.e.y) &&        max(l2.s.y, l2.e.y) >= min(l1.s.y, l1.e.y) &&        sgn((l2.s - l1.e) ^ (l1.s - l1.e)) * sgn((l2.e-l1.e) ^ (l1.s - l1.e)) <= 0 &&        sgn((l1.s - l2.e) ^ (l2.s - l2.e)) * sgn((l1.e-l2.e) ^ (l2.s - l2.e)) <= 0;}db dfs(P p1, P p2, int k){    if(k < 0) return 0.0;    bool ok1 = r[k].in(p1), ok2 = r[k].in(p2);    if(ok1 && ok2)    {        return (p1 - p2).len()*r[k].ch;    }    if(sgn(p1.x - p2.x) == 0)    {        if(p1.x > r[k].a.x - eps && p1.x < r[k].b.x + eps)        { if(p1.y < p2.y) swap(p1, p2), swap(ok1, ok2); if(p2.y > r[k].b.y - eps || p1.y < r[k].a.y + eps) return 0.0; P u(p1.x, r[k].b.y), d(p1.x, r[k].a.y); if(p1.y < r[k].b.y + eps) return (p1.y - r[k].a.y) * r[k].ch + dfs(d, p2, k - 1); else if(p2.y > r[k].a.y - eps) return (r[k].b.y - p2.y) * r[k].ch + dfs(p1, u, k - 1); else return dfs(p1, u, k - 1) + dfs(d, p2, k - 1) + (r[k].b.y - r[k].a.y) * r[k].ch;        }        else return 0.0;    }    if(sgn(p1.y - p2.y) == 0)    {        if(p1.y > r[k].a.y - eps && p1.y < r[k].b.y + eps)        { if(p1.x > p2.x) swap(p1, p2), swap(ok1, ok2); if(p2.x < r[k].a.x + eps || p1.x > r[k].b.x - eps) return 0.0; P pl(r[k].a.x, p1.y), pr(r[k].b.x, p1.y); if(p1.x > r[k].a.x - eps) return dfs(pr, p2, k - 1) + (r[k].b.x - p1.x) * r[k].ch; else if(p2.x < r[k].b.x + eps) return dfs(p1, pl, k - 1) + (p2.x - r[k].a.x) * r[k].ch; else return dfs(p1, pl, k - 1) + dfs(pr, p2, k - 1) + (r[k].b.x - r[k].a.x) * r[k].ch;        }        else return 0.0;    }    P c[5];    int lx(0);    c[lx++] = P(r[k].a.x, r[k].a.y);    c[lx++] = P(r[k].a.x, r[k].b.y);    c[lx++] = P(r[k].b.x, r[k].b.y);    c[lx++] = P(r[k].b.x, r[k].a.y);    c[4] = c[0];    P res[5];    int ln(0);    for(int j = 0; j < lx; j++)    {        Line l1(c[j], c[j + 1]), l2(p1, p2);        if(inter(l1, l2))        { res[ln++] = l1 & l2;        }    }    sort(res, res + ln);    int cnt = unique(res, res + ln) - res;    if(cnt == 0) return dfs(p1, p2, k - 1);    if(!ok1 && ok2) swap(ok1, ok2), swap(p1, p2);    if(cnt == 1)    {        if(!ok2 && !ok1) return dfs(p1, p2, k - 1);        return dfs(p2, res[0], k - 1) + (p1 - res[0]).len() * r[k].ch;    }    if(p1.x > p2.x) swap(p1, p2);    return dfs(p1, res[0], k - 1) + dfs(res[1], p2, k - 1) + (res[1] - res[0]).len() * r[k].ch;}int main(){#ifdef PKWV    freopen("in.in", "r", stdin);#endif    int n, m;    while(scanf("%d%d", &n, &m) + 1)    {        for(int i = 0; i < n; i++)        { r[i].input();        }        for(int i = 0; i < m; i++) p[i].input();        db s(0.0);        for(int i = 1; i < m; i++)        { s += dfs(p[i - 1], p[i], n - 1);        }        printf("%.2fn", s);    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370506.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号