ZOJ 2747 Paint the Wall(多矩形面积覆盖)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2747
题意:
有n个矩形,每个矩形都有颜色,这些矩形相继被画到平板上去.问你最后平板上有哪些颜色,且各种颜色的面积各占多少? 颜色最多100种,用1-100标记.
分析:
本题类似于POJ 1151 :
http://blog.youkuaiyun.com/u013480600/article/details/39322791
本题首先离散化所有X和Y坐标,把平板分成小网格.然后用mp[i][j]数组标记小网格当前的颜色是什么.
最后我们扫描每一个小网格,求出每种颜色的总面积按序输出即可.
输出的时候注意is/are和 color/colors的区别.
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=200+10;
struct Node
{
int x1,y1,x2,y2,c;//c是颜色
}nodes[maxn];
int n;
int num1,num2;
int x[maxn],y[maxn];
int color[maxn][maxn];
int main()
{
int w,h,kase=0;
while(scanf("%d%d",&h,&w)==2 && h)
{
if(kase>0) printf("\n");
num1=num2=0;
memset(color,0,sizeof(color));
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d%d%d%d%d",&nodes[i].x1,&nodes[i].y1,&nodes[i].x2,&nodes[i].y2,&nodes[i].c);
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)
color[j][k]=nodes[i].c;//着色
}
int area[maxn];//每种颜色的面积
memset(area,0,sizeof(area));
int ans=0;//还剩多少种颜色
for(int i=0;i<num1;++i)
for(int j=0;j<num2;++j)
if(color[i][j]) area[color[i][j]] += (x[i+1]-x[i])*(y[j+1]-y[j]);
printf("Case %d:\n",++kase);
for(int i=1;i<=100;++i)if(area[i])
{
printf("%d %d\n",i,area[i]);
++ans;
}
printf("There %s %d %s left on the wall.\n",ans>1?"are":"is",ans,ans>1?"colors":"color");
}
return 0;
}