经典问题,矩形面积并。
解法:一、矩形分割,每个矩形的两个横坐标和两个纵坐标排序,这样得到2n*2n个区间,对这些区间依次判断是否包含在n个矩形中间即可。
二、扫描线。具体还没实现过。
#include <stdio.h>
#include <algorithm>
#define N 105
struct rectangle
{
double x, y;
double r;
}rec[N];
double x[2 * N], y[2 * N];
int main()
{
int n, cas = 1;
while(scanf("%d", &n), n)
{
double ans = 0;
for(int i = 0; i < n; i++)
{
scanf("%lf %lf %lf", &rec[i].x, &rec[i].y, &rec[i].r);
x[i] = rec[i].x - rec[i].r, x[i + n] = rec[i].x + rec[i].r;
y[i] = rec[i].y - rec[i].r, y[i + n] = rec[i].y + rec[i].r;
}
std::sort(x, x + 2 * n);
std::sort(y, y + 2 * n);
for(int i = 0; i < 2 * n - 1; i++)
{
for(int j = 0; j < 2 * n - 1; j++)
{
for(int k = 0; k < n; k++)
{
if(rec[k].x - rec[k].r <= x[i] && rec[k].x + rec[k].r >= x[i + 1])
if(rec[k].y - rec[k].r <= y[j] && rec[k].y + rec[k].r >= y[j + 1])
{
ans += (x[i + 1] - x[i]) * (y[j + 1] - y[j]);
break;
}
}
}
}
printf("%d %.2lf\n", cas++, ans);
}
return 0;
}