| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 16244 | Accepted: 6183 |
Description
Input
Output
Sample Input
2 10 10 20 20 15 15 25 25.5 0
Sample Output
Test case #1 Total explored area: 180.00
Source
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define N 100000
using namespace std;
struct num
{
double x1,y1,x2,y2;
}a[N],b[N];
int Top,pos;
bool uv;
bool cmp(const struct num &p1,const struct num &p2)
{
return p1.x1<p2.x1;
}
int main()
{
//freopen("data.txt","r",stdin);
void ch();
void add(double x1,double y1,double x2,double y2,int p);
int n;
int T=1;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
break;
}
for(int i=0;i<=n-1;i++)
{
scanf("%lf %lf %lf %lf",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);
}
sort(a,a+n,cmp);
Top = 0;
for(int i=0;i<=n-1;i++)
{
pos = Top;
double x3 = a[i].x1,y3 = a[i].y1;
double x4 = a[i].x2,y4 = a[i].y2;
bool in = false;
for(int j=0;j<=Top-1;j++)
{
double x1 = b[j].x1,y1 = b[j].y1;
double x2 = b[j].x2,y2 = b[j].y2;
if(x3>x2||x1>x4||y3>y2||y1>y4)
{
continue;
}
in = true;
pos = j;
uv = false;
double k1 = max(x1,x3);
double k2 = min(x4,x2);
if(k1>x1)
{
add(x1,y1,k1,y2,pos);
ch();
}
if(k2<x2)
{
add(k2,y1,x2,y2,pos);
ch();
}
double k3 = max(y3,y1);
double k4 = min(y4,y2);
if(k3>y1)
{
add(k1,y1,k2,y3,pos);
ch();
}
if(k4<y2)
{
add(k1,y4,k2,y2,pos);
ch();
}
}
add(x3,y3,x4,y4,pos);
if(!in)
{
Top++;
continue;
}
ch();
}
double sum = 0;
for(int i=0;i<=Top-1;i++)
{
sum+=(b[i].x2-b[i].x1)*(b[i].y2-b[i].y1);
}
printf("Test case #%d\n",T++);
printf("Total explored area: %.2lf\n",sum);
printf("\n");
}
return 0;
}
void ch()
{
if(uv)
{
Top++;
}
pos = Top;
uv = true;
}
void add(double x1,double y1,double x2,double y2,int p)
{
b[p].x1 = x1;
b[p].y1 = y1;
b[p].x2 = x2;
b[p].y2 = y2;
}
POJ 1151 Atlantis,布布扣,bubuko.com
原文:http://blog.csdn.net/yongxingao/article/details/20400867