zoukankan      html  css  js  c++  java
  • POJ 1177 Picture

    POJ_1177

        这个题目和POJ_1151基本思路是一样的,一些具体的思路可以参考我的那篇题解:http://www.cnblogs.com/staginner/archive/2012/02/20/2359396.html

        相比算面积不同的是,每次计算面积的操作需要改为计算周长的操作,同时周长可以分成平行于x轴的部分和平行y轴的部分分开来求。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define zero 1e-8
    #define MAXD 10010
    #define INF 10010
    int N, X, M;
    struct square
    {
    double x1, y1, x2, y2;
    }s[MAXD];
    double left[MAXD], right[MAXD], tx[MAXD], ty[MAXD];
    int cmp1(const void *_p, const void *_q)
    {
    square *p = (square *)_p, *q = (square *)_q;
    return p->y1 < q->y1 ? -1 : 1;
    }
    int cmp2(const void *_p, const void *_q)
    {
    square *p = (square *)_p, *q = (square *)_q;
    return p->x1 < q->x1 ? -1 : 1;
    }
    int cmp3(const void *_p, const void *_q)
    {
    double *p = (double *)_p, *q = (double *)_q;
    return *p < *q ? -1 : 1;
    }
    double fabs(double x)
    {
    return x < 0 ? -x : x;
    }
    int dcmp(double x)
    {
    return fabs(x) < zero ? 0 : (x < 0 ? -1 : 1);
    }
    void init()
    {
    int i, j, k;
    X = 0;
    for(i = 0; i < N; i ++)
    {
    scanf("%lf%lf%lf%lf", &s[i].x1, &s[i].y1, &s[i].x2, &s[i].y2);
    tx[X] = s[i].x1, ty[X] = s[i].y1;
    ++ X;
    tx[X] = s[i].x2, ty[X] = s[i].y2;
    ++ X;
    }
    }
    void solve()
    {
    int i, j, k;
    double ans = 0, up, down;
    qsort(s, N, sizeof(s[0]), cmp1);
    qsort(tx, X, sizeof(tx[0]), cmp3);
    M = 0;
    for(i = 1; i < X; i ++)
    if(dcmp(tx[i] - tx[i - 1]) != 0)
    {
    left[M] = tx[i - 1], right[M] = tx[i];
    ++ M;
    }
    for(i = 0; i < M; i ++)
    {
    up = down = -INF;
    for(j = 0; j < N; j ++)
    if(dcmp(left[i] - s[j].x1) >= 0 && dcmp(right[i] - s[j].x2) <= 0)
    {
    if(dcmp(s[j].y1 - up) > 0)
    {
    ans += 2 * (right[i] - left[i]);
    down = s[j].y1, up = s[j].y2;
    }
    else if(dcmp(s[j].y2 - up) > 0)
    up = s[j].y2;
    }
    }
    qsort(s, N, sizeof(s[0]), cmp2);
    qsort(ty, X, sizeof(ty[0]), cmp3);
    M = 0;
    for(i = 1; i < X; i ++)
    if(dcmp(ty[i] - ty[i - 1]) != 0)
    {
    left[M] = ty[i - 1], right[M] = ty[i];
    ++ M;
    }
    for(i = 0; i < M; i ++)
    {
    up = down = -INF;
    for(j = 0; j < N; j ++)
    if(dcmp(left[i] - s[j].y1) >= 0 && dcmp(right[i] - s[j].y2) <= 0)
    {
    if(dcmp(s[j].x1 - up) > 0)
    {
    ans += 2 * (right[i] - left[i]);
    down = s[j].x1, up = s[j].x2;
    }
    else if(dcmp(s[j].x2 - up) > 0)
    up = s[j].x2;
    }
    }
    printf("%.0lf\n", ans);
    }
    int main()
    {
    while(scanf("%d", &N) == 1)
    {
    init();
    solve();
    }
    return 0;
    }


  • 相关阅读:
    2014年终总结
    杭电2014——青年歌手大奖赛_评委会打分
    nyoj---t448(寻找最大数)
    nyoj_t218(Dinner)
    将string转换成char*
    nyoj71--独木舟上的旅行
    基于贪心算法的几类区间覆盖问题
    会场安排问题—NYOJ14
    南阳理工ACM——106背包问题
    南阳理工91——阶乘之和
  • 原文地址:https://www.cnblogs.com/staginner/p/2360720.html
Copyright © 2011-2022 走看看