• (Vij)图形面积


    描述

    桌面上放了N个平行于坐标轴的矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积。
    格式

    输入格式

    输入第一行为一个数N(1≤N≤100),表示矩形的数量。下面N行,每行四个整数,分别表示每个矩形的左下角和右上角的坐标,坐标范围为–10^8到10^8之间的整数。
    输出格式

    输出只有一行,一个整数,表示图形的面积。
    样例1

    样例输入1

    3
    1 1 4 3
    2 -1 3 2
    4 0 5 2
    Copy
    样例输出1

    10

    分析
    将每个横坐标离散进一个数组里,每个纵坐标离散进一个数组里。
    接着分别排序。
    然后枚举,枚举离散x数组里的x[i]和x[i+1]以及离散y数组里的y[i]和y[i+1](就是一个个地求区块面积)
    然后还要枚举原矩形的坐标,如果现在枚举的坐标在原矩形内,那么便可以加上这个面积。同时为了防止重复相加一个区块,加完以后应当跳出第三层循环。

    程序:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    long long n,x1[101],y1[101],x2[101],y2[101],x[201],y[201];
    long long i,j,k;
    long long ass;
    bool cmp(long long a,long long b)
    {
        return a<b;
    }
    int main()
    {
        scanf("%lld",&n);
        for (i=1;i<=n;i++)
        {
            scanf("%lld%lld%lld%lld",&x1[i],&y1[i],&x2[i],&y2[i]);
            x[i*2-1]=x1[i];x[i*2]=x2[i];
            y[i*2-1]=y1[i];y[i*2]=y2[i];
        }
        sort(x+1,x+n*2+1,cmp);
        sort(y+1,y+n*2+1,cmp);
        for (i=1;i<=n*2-1;i++)
        for (j=1;j<=n*2-1;j++)
        for (k=1;k<=n;k++)
        if (x[i]>=x1[k]&&y[j]>=y1[k]&&x[i+1]<=x2[k]&&y[j+1]<=y2[k])
        {
            ass+=(x[i+1]-x[i])*(y[j+1]-y[j]);
            break;
        }
        printf("%lld",ass);
    }
  • 相关阅读:
    118. Pascal's Triangle
    172. Factorial Trailing Zeroes
    345. Reverse Vowels of a String
    58. Length of Last Word
    383. Ransom Note
    387. First Unique Character in a String
    83. Remove Duplicates from Sorted List
    关于Assembly.CreateInstance()与Activator.CreateInstance()方法
    查看占用指定端口的进程
    如何使用eclipse打开已有工程
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500012.html
Copyright © 2020-2023  润新知