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; }