矩形面积求并

【题目描述】

输入n个矩形,求它们总共占地面积(也就是求一下面积的并)。

【输入描述】

可能有多组数据,读到n=0为止(不超过15组)。

每组数据第一行包含1个数n,表示矩形个数(n <= 100);

接下来n行每行4个实数x1、y1、x2、y1(0 <= x1 < x2 <= 100000,0 <= y1 < y2 <= 100000),表示矩形的左下角坐标和右上角坐标。

【输出描述】

对于每组数据输出一行表示答案。

【样例输入】

2

10 10 20 20

15 15 25 25.5

0

【样例输出】

180.00

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,k,f[201][201];
double ans,X[201],Y[201],i[201][5];
int main()
{
    while (cin>>n)
    {
        if (!n)
          break;
        k=1;
        ans=0.0;
        memset(f,0,sizeof(f));
        for (int a=1;a<=n;a++)
        {
            cin>>i[a][1]>>i[a][2]>>i[a][3]>>i[a][4];
            X[k]=i[a][1];
            Y[k]=i[a][2];
            k++;
            X[k]=i[a][3];
            Y[k]=i[a][4];
            k++;
        }
        sort(X+1,X+n*2+1);
        sort(Y+1,Y+n*2+1);
        for (int k=1;k<=n;k++)
        {
            int A1,A2,B1,B2;
            for (A1=1;A1<=2*n;A1++)
              if (X[A1]==i[k][1])
                break;
            for (A2=1;A2<=2*n;A2++)
              if (X[A2]==i[k][3])
                break;
            for (B1=1;B1<=2*n;B1++)
              if (Y[B1]==i[k][2])
                break;
            for (B2=1;B2<=2*n;B2++)
              if (Y[B2]==i[k][4])
                break;
            for (int a=A1;a<A2;a++)
              for (int b=B1;b<B2;b++)
                f[a][b]=1;
        }
        for (int a=1;a<=n*2;a++)
          for (int b=1;b<=n*2;b++)
            ans+=f[a][b]*(X[a+1]-X[a])*(Y[b+1]-Y[b]);
        printf("%.2f
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Ackermann/p/5837592.html