UVA 11345 Rectangles(n个矩形重叠覆盖的面积)

UVA 11345 Rectangles(n个矩形重叠覆盖的面积)

题意:

       给你n个矩形的左上角和右下角,要你输出那些被所有矩形都覆盖的面积大小.

分析:

       本题与POJ 1151 Atlantis基本类似,详细分析可以参考:

http://blog.csdn.net/u013480600/article/details/39322791

       下面简单说下本题的主要思想:

       获得了n个矩形,那么我们把所有矩形的X和Y坐标取出来,就可以把整个二维平面分成很多个小网格(网格面积不一定相同),任何一个原始矩形都包含了1个或多个小网格. 然后我们只要一次扫描,看看每个小网格被多少个原始矩形覆盖即可. 最终我们求出那些覆盖数==n的小网格的面积和输出即可.

AC代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=100+5;

struct Node//矩形
{
    int x1,y1,x2,y2;
}nodes[maxn];

int n;//n个矩形
int x[maxn],y[maxn];
int num1,num2;//记录有多少不同x和y坐标
int mp[maxn][maxn];//标记小网格被覆盖多少次

int main()
{
    int T; scanf("%d",&T);
    for(int kase=1;kase<=T;++kase)
    {
        num1=num2=0;
        memset(mp,0,sizeof(mp));
        scanf("%d",&n);
        for(int i=0;i<n;++i)
        {
            scanf("%d%d%d%d",&nodes[i].x1,&nodes[i].y1,&nodes[i].x2,&nodes[i].y2);
            x[num1++]=nodes[i].x1;
            x[num1++]=nodes[i].x2;
            y[num2++]=nodes[i].y1;
            y[num2++]=nodes[i].y2;
        }
        sort(x,x+num1);
        sort(y,y+num2);
        num1=unique(x,x+num1)-x;
        num2=unique(y,y+num2)-y;

        for(int i=0;i<n;++i)
        {
            int L_x=lower_bound(x,x+num1,nodes[i].x1)-x;
            int R_x=lower_bound(x,x+num1,nodes[i].x2)-x;
            int L_y=lower_bound(y,y+num2,nodes[i].y1)-y;
            int R_y=lower_bound(y,y+num2,nodes[i].y2)-y;

            for(int j=L_x;j<R_x;++j)
            for(int k=L_y;k<R_y;++k)
                mp[j][k]++;
        }

        int ans=0;
        for(int i=0;i<num1;++i)
        for(int j=0;j<num2;++j)
        if(mp[i][j]==n) ans+= (x[i+1]-x[i])*(y[j+1]-y[j]);
        printf("Case %d: %d\n",kase,ans);
    }
    return 0;
}

你可能感兴趣的:(Algorithm,算法,ACM,计算几何)