1.题目描述
N代表矩形的个数,接下来N行,每行4个数:(
x1,y1
)(
x2,y2
)表示一个矩形的左下点和右上点的坐标,求所有矩形所覆盖的面积。
要求:
1. N<100 , (
x1,x2,y1,y2
)<
105
, 可以为浮点数
2. 面积显然可以多处重叠
2.思路
case: 2 / 10 10 20 20 / 15 15 25 25.5
如图可知,题目可以转化为图中7块面积的和计算。
- 离散化:将所有x坐标放在X[]中,y坐标放在Y[]中,将他们按升序排序
- 设计数组xy[][], xy[i][j] = 1 表示 (x[i], y[j]) 于 (x[i-1], y[j-1]) 形成的小矩形是要求的小矩形。 所以只需要找对于每个矩形( x1,y1 )( x2,y2 )确定 i1,i2,j1,j2 ,使得, X[i1]>x1,X[i2]<=x2,Y[i1]<y1,Y[i2]>=y2 令xy[i][j]= 1 (i从 i1到i2,j从j1到j2 )
3.代码
#include<iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
double x[201],y[201],s[101][4];
int xy[201][201];
int n,cas=0;
double sum;
int main()
{
int i,j,k;
while(scanf("%d",&n))
{
if(n==0) break;
cas++;
k=0;
sum=0.0;
memset(xy,0,sizeof(xy));
for(i=1;i<=n;i++)
{
cin>>s[i][0]>>s[i][1]>>s[i][2]>>s[i][3];
x[k]=s[i][0];
y[k]=s[i][1];
k++;
x[k]=s[i][2];
y[k]=s[i][3];
k++;
}
sort(x,x+2*n);
sort(y,y+2*n);
for(k=1;k<=n;k++)
{
int i1,i2,j1,j2;
for(i1=0;i1<2*n;i1++)
{
if(x[i1]==s[k][0])
break;
}
for(i2=0;i2<2*n;i2++)
{
if(x[i2]==s[k][2])
break;
}
for(j1=0;j1<2*n;j1++)
{
if(y[j1]==s[k][1])
break;
}
for(j2=0;j2<2*n;j2++)
{
if(y[j2]==s[k][3])
break;
}
for(i=i1;i<i2;i++)
{
for(j=j1;j<j2;j++)
{
xy[i][j]=1;
}
}
}
for(i=0;i<2*n;i++)
{
for(j=0;j<2*n;j++)
{
sum+=xy[i][j]*(x[i+1]-x[i])*(y[j+1]-y[j]);
}
}
printf("Test case #%d\n",cas);
printf("Total explored area: %.2f\n",sum);
printf("\n");
}
return 0;
}