0 <= x1 < x2 <= 100000;0 <= y1 < y2 <= 100000
题意是在坐标上给n个矩阵
问这些矩阵覆盖的面积是多少
如果范围小,我们可以把所有矩阵覆盖的点都标记上1,但是范围非常大,可是给的矩阵数量却不多,那么我们可以考虑离散化。
也就是把输入的200个x和200个y排序后一一对应到map[i][j]中,只考虑这些点。
相当于此时输入的100个框框可以在map1中储存了,只储存每个小!小!小!矩阵的左下角。是因为存完4个点再按4个点来判断可能会错误(想想那是个什么情况)
然后计算面积的时候可以计算这个矩阵的长与宽,每次计算面积不是1,而是一个矩阵的面积。
#include <queue>
#include<iostream>
#include<stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <ctime>
using namespace std;
struct ttt{
double x1,y1,x2,y2;
};
ttt qq[105];
double x[205],y[205];
int map1[205][205];
int main(){
// freopen("in.txt","r",stdin);
//freopen("output.txt","w",stdout);
int i,j,k,l,f1,f2,f3,t1,t2,t3,m;
int l1,l2,l3,f4,f5;
int n,sum1;
int tt=0;
while(scanf("%d",&n)==1&&n){
t1=0;
tt++;
for(i=1;i<=n;i++){
cin >> qq[i].x1 >> qq[i].y1 >> qq[i].x2 >> qq[i].y2;
t1++;
x[t1]=qq[i].x1;
y[t1]=qq[i].y1;
t1++;
x[t1]=qq[i].x2;
y[t1]=qq[i].y2;
}
sort(x+1,x+1+t1);
sort(y+1,y+1+t1);
memset(map1,0,sizeof(map1));
for(i=1;i<=n;i++){
for(j=1;j<=t1;j++)
for(k=1;k<=t1;k++){
if(qq[i].x1<=x[j]&&x[j]<qq[i].x2&&qq[i].y1<=y[k]&&y[k]<qq[i].y2){
map1[j][k]=1;
}
}
}
double sum2=0;
double g1;
for(i=1;i<=t1;i++){
g1=x[i+1]-x[i];
for(j=1;j<=t1;j++)
if(map1[i][j]==1){
sum2+=g1*(y[j+1]-y[j]);
}
}
cout << "Test case #" <<tt << endl;
cout << "Total explored area: ";
printf("%.2f\n",sum2);
cout << endl;
}
return 0;
}
.