POJ 1151 Atlantis(离散化)

来源:互联网 发布:淘宝暗语枪模 编辑:程序博客网 时间:2024/05/20 23:06

大意:求出不重叠矩形的面积交。

思路:同两个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;}
1 0