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