您的位置:首页 > 其它

uva 688 - Mobile Phone Coverage

2016-01-02 15:41 363 查看
经典问题,矩形面积并。
解法:一、矩形分割,每个矩形的两个横坐标和两个纵坐标排序,这样得到2n*2n个区间,对这些区间依次判断是否包含在n个矩形中间即可。
  二、扫描线。具体还没实现过。
详见:http://www.algorithmist.com/index.php/UVa_688
另:http://www.ii.uni.wroc.pl/boi/index.phtml?id=11

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int main()
{
int n, i, j, k, cases;
double area, x[105], y[105], r[105], dx[105*2], dy[105*2];
cases = 0;
while(cin>>n && n)
{
for(i=0; i<n; i++)
{
cin >> x[i] >> y[i] >> r[i];
dx[i*2] = x[i] - r[i], dx[i*2+1] = x[i] + r[i];
dy[i*2] = y[i] - r[i], dy[i*2+1] = y[i] + r[i];
}
sort(dx, dx+2*n);
sort(dy, dy+2*n);
area = 0.0;
for(i = 1; i < 2*n; i++)
for(j = 1; j < 2*n; j++)
for(k = 0; k < n; k++)
{
if(dx[i-1]>=x[k]-r[k] && dx[i]<=x[k]+r[k])
if(dy[j-1]>=y[k]-r[k] && dy[j]<=y[k]+r[k])
{
area += (dx[i] - dx[i-1]) * (dy[j] - dy[j-1]);
break;
}
}
printf("%d %.2lf\n", ++cases, area);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: