求矩形并的面积

大概意思就是,给定n个矩形,求出它们的矩形面积之和,相交的面积算一次。

思路:离散化,将组成的图形 按照给定点的横纵坐标划线,这样就可以将整个要求的图形的面积分成几个小块,然后依次求每个小块的面积。注意,首先要判断方块在不在包含的范围内。具体做法就是 先将 横纵坐标从小到大排序,去掉空白的方块,最后将各小方块相加,求出总面积。


#include <iostream>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;

#define MAXN 210
int flag[MAXN][MAXN];
double x[MAXN];   //保留所有x的坐标
double y[MAXN];   //保留所有y的坐标

struct rectangle{
    double a,b;
    double u,v;
}rec[MAXN];

int main(){
    int n;
    int i=0,j=0,k;
    double x1,y1,x2,y2;
    cin>>n;
    memset(flag,0,sizeof(flag));
    for(k=0;k<n;k++){
        cin>>x1>>y1>>x2>>y2;
        rec[j].a = x1;
        rec[j].b = y1;
        rec[j].u = x2;
        rec[j].v = y2;
        j++;
        x[i] = x1;
        y[i] = y1;
        i++;
        x[i] = x2;
        y[i] = y2;
        i++;
    }
    sort(x,x+2*n);
    sort(y,y+2*n);
    for(int h=0;h<n;h++){    //求包含的小矩形
        for(i=0;i<2*n;i++){
            if(x[i]>=rec[h].u)
                break;
            for(j=0;j<2*n;j++){
                if(y[j]>=rec[h].v)
                    break;
                if(x[i]>=rec[h].a && y[j]>=rec[h].b)
                    flag[i][j] = 1;
            }
        }
    }
    double sum = 0;
    for(i=0;i<2*n-1;i++){
        for(j=0;j<2*n-1;j++){
            sum += flag[i][j]*(x[i+1]-x[i])*(y[j+1]-y[j]);
        }
    }
    cout<<sum<<endl;
    return 0;
}

比较遗憾的是,这种解法只适合矩形个数比较少的情况,如果矩形数量一多,分割的小块个数就变多,那计算的时间就变长了。所以,省时的方法还是用 线段树来做。

你可能感兴趣的:(C++,算法)