http://poj.org/problem?id=1151
题目大意:给出 n 个矩形的“左下”和“右上”顶点坐标,求面积并;
思路:由于坐标值为实数,所以不能直接用数组模拟,要先将所有坐标值离散化处理;
#include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; #define SIZE 103<<1 double a[SIZE][4],x[SIZE],y[SIZE]; int map[SIZE][SIZE]; int main() { int T=1,n,i,j,l,k; int x1,y1,x2,y2; while(scanf("%d",&n),n){ for(i=0,k=0;i<n;i++){ scanf("%lf%lf%lf%lf",&a[i][0],&a[i][1],&a[i][2],&a[i][3]); x[k]=a[i][0]; y[k]=a[i][1]; k++; x[k]=a[i][2]; y[k]=a[i][3]; k++; } sort(x,x+k); sort(y,y+k); memset(map,0,sizeof(map)); for(i=0;i<n;i++){ for(x1=0;x1<k;x1++){ if(x[x1]==a[i][0]) break; } for(y1=0;y1<k;y1++){ if(y[y1]==a[i][1]) break; } for(x2=0;x2<k;x2++){ if(x[x2]==a[i][2]) break; } for(y2=0;y2<k;y2++){ if(y[y2]==a[i][3]) break; } for(l=x1;l<x2;l++){ for(j=y1;j<y2;j++){ map[l][j]=1; } } } double sum=0; for(i=0;i<k-1;i++){ for(j=0;j<k-1;j++){ if(map[i][j]==1){ sum+=(x[i+1]-x[i])*(y[j+1]-y[j]); } } } printf("Test case #%d\n",T++); printf("Total explored area: %.2lf\n\n",sum); } return 0; }