离散化矩形面积求并

链接:http://codevs.cn/problem/3044/


题目描述 Description

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

输入描述 Input Description

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

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

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

输出描述 Output Description

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

样例输入 Sample Input
2
10 10 20 20
15 15 25 25.5
0
样例输出 Sample Output
180.00
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<cmath>
#define mst(ss,b) memset((ss),(b),sizeof(ss))
#define maxn 0x3f3f3f3f
using namespace std;
int n;
struct node{
    double x1,x2,y1,y2;
} s[110];
double x[210],y[210];
int a[210][210];
int main(){
    while(scanf("%d",&n)!=EOF){
        mst(a,0);
        mst(s,0);
        mst(x,0);
        mst(y,0);
        if(n==0)
            break;
        for(int i=1;i<=n;i++){
            scanf("%lf%lf%lf%lf",&s[i].x1,&s[i].y1,&s[i].x2,&s[i].y2);
            x[i*2-1]=s[i].x1;
            x[i*2]=s[i].x2;
            y[i*2-1]=s[i].y1;
            y[i*2]=s[i].y2;
        }
        sort(x+1,x+2*n+1);
        sort(y+1,y+2*n+1);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=2*n;j++){
                for(int k=1;k<=2*n;k++){
                    if(x[j]>s[i].x1 && x[j]<=s[i].x2 && y[k]>s[i].y1 && y[k]<=s[i].y2)
                        a[j][k]=1;
                }
            }
        }
        double sum=0;
        for(int i=1;i<=2*n;i++){
            for(int j=1;j<=2*n;j++){
                if(a[i][j])
                    sum+=(x[i]-x[i-1])*(y[j]-y[j-1]);
            }
        }
        printf("%.2lf\n",sum);
    }
    return 0;
}


你可能感兴趣的:(离散化矩形面积求并)