首先分离出所有的横坐标和纵坐标分别按升序存入数组X[ ]和Y[ ]中.
设数组XY[ ][ ].对于每个矩形(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)
设数组XY[ ][ ].对于每个矩形(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)
统计面积:area+=XY[i][j] *(X[i]-X[i-1])*(Y[i] – Y[i-1])
#include<algorithm>
using namespace std;
#define N 100
double a[N][4];
double X[2*N],Y[2*N];
int XY[2*N][2*N];
int main()
{
int n,i,j,k,count,i1,i2,j1,j2,t=1;
double area;
while(scanf("%d",&n) && n)
{
count=0;
for(i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf",&a[i][0],&a[i][1],&a[i][2],&a[i][3]);
X[count]=a[i][0];
Y[count]=a[i][1];
count++;
X[count]=a[i][2];
Y[count]=a[i][3];
count++;
}
sort(X,X+2*n);
sort(Y,Y+2*n);
memset(XY,0,sizeof(XY));
for(k=0;k<n;k++)
{
for(i1=0;i1<2*n;i1++)
{
if(X[i1]==a[k][0])
break;
}
for(j1=0;j1<2*n;j1++)
{
if(Y[j1]==a[k][1])
break;
}
for(i2=0;i2<2*n;i2++)
{
if(X[i2]==a[k][2])
break;
}
for(j2=0;j2<2*n;j2++)
{
if(Y[j2]==a[k][3])
break;
}
for(i=i1;i<i2;i++)
for(j=j1;j<j2;j++)
XY[i][j]=1;
}
area=0;
for(i=0;i<2*n;i++)
for(j=0;j<2*n;j++)
area+=XY[i][j]*(X[i+1]-X[i])*(Y[j+1]-Y[j]);
printf("Test case #%d\n",t++);
printf("Total explored area: %.2lf\n\n",area);
}
return 0;
}