UVA 11345 Rectangles(n个矩形重叠覆盖的面积)
题意:
给你n个矩形的左上角和右下角,要你输出那些被所有矩形都覆盖的面积大小.
分析:
本题与POJ 1151 Atlantis基本类似,详细分析可以参考:
http://blog.youkuaiyun.com/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;
}