您的位置:首页 > 其它

POJ 1151 Atlantis(离散化)

2016-04-25 11:32 302 查看
大意:求出不重叠矩形的面积交。

思路:同两个x[],y[]分别放x,y坐标,然后枚举标记所有的矩形范围。

最后两相邻点,来求面积。

求出不重叠矩形的面积交。
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
#include<stack>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
#define LL unsigned __int64
#define inf 0x3f3f3f3f
#define eps 1e-8
#include<vector>

using namespace std;

struct node{
double x,y,x1,y1;
}q[100010];

double x[233],y[233];
bool mp[233][233];
int main(){
int n,m,i,j,k,cla = 1;
while(~scanf("%d",&n)&&n){
k = 0;
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
for(i = 0;i < n;++ i){
scanf("%lf%lf%lf%lf",&q[i].x,&q[i].y,&q[i].x1,&q[i].y1);
x[k] = q[i].x;
y[k++] = q[i].y;
x[k] = q[i].x1;
y[k++] = q[i].y1;
}
sort(x,x+2*n);sort(y,y+2*n);
memset(mp,false,sizeof(mp));
double ans = 0;
for(k = 0;k < n;++ k){
int a,b,aa,bb;
for(a = 0;a < 2*n;++ a)
if( fabs(x[a] - q[k].x)<=eps ) break;
for(b = 0;b < 2*n;++ b )
if( fabs(y[b] - q[k].y)<=eps ) break;
for(aa = 0;aa < 2*n;++ aa)
if( fabs(x[aa] - q[k].x1)<=eps ) break;
for(bb = 0;bb <2*n ;++ bb)
if( fabs(y[bb] - q[k].y1)<=eps ) break;
for(i = a;i < aa;++ i){
for(j = b;j < bb ;++ j){
mp[i][j] = true;
}
}
}

for(i = 0;i < 2*n;++ i){
for(j = 0;j < 2*n;++ j){
if(mp[i][j])
ans += (x[i+1]-x[i])*(y[j+1]-y[j]);
}
}
printf("Test case #%d\nTotal explored area: ",cla++);
printf("%.2f\n\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  离散化