#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
#include <string>
#include <vector>
using namespace std;
struct
{
double x0,y0,x1,y1;
}square[220];
struct inf
{
double ll,rr,hh;
int key;
}line[440];
int cmp(struct inf q,struct inf w)
{
return q.hh<w.hh;
}
double x[440];
double tree[5200];
int treekey[5200];
int change(int l,int r,double ll,double rr,int now,int key)
{
if(l+1==r)
{
treekey[now]+=key;
if(treekey[now]!=0)
{
tree[now]=x[r]-x[l];
}
else
{
tree[now]=0;
}
return 0;
}
int mid=(l+r)/2;
if(rr<=x[mid])
{
change( l, mid, ll, rr, now*2, key);
}
else if(ll>=x[mid])
{
change( mid, r, ll, rr, now*2+1, key);
}
else
{
change( l, mid, ll, rr, now*2, key);
change( mid, r, ll, rr, now*2+1, key);
}
tree[now]=tree[now*2]+tree[now*2+1];
return 0;
}
int main()
{
int i,j,n,m,jishu=0;
while(1)
{
scanf("%d",&n);
jishu++;
if(n==0)
break;
for(i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf",&square[i].x0,&square[i].y0,&square[i].x1,&square[i].y1);
x[i]=square[i].x0;
x[i+n]=square[i].x1;
line[i].ll=square[i].x0;
line[i].rr=square[i].x1;
line[i].hh=square[i].y0;
line[i].key=1;
line[i+n].ll=square[i].x0;
line[i+n].rr=square[i].x1;
line[i+n].hh=square[i].y1;
line[i+n].key=-1;
}
sort(x,x+2*n);
sort(line,line+2*n,cmp);
m=unique(x,x+2*n)-x;
double ans=0;
for(i=0;i<2*n-1;i++)
{
change(0,m-1,line[i].ll,line[i].rr,1,line[i].key);
ans+=(line[i+1].hh-line[i].hh)*tree[1];
}
printf("Test case #%d\nTotal explored area: %0.2lf\n\n",jishu,ans);
memset(tree,0,sizeof tree);
memset(treekey,0,sizeof treekey);
memset(x,0,sizeof x);
memset(line,0,sizeof line);
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
#include <string>
#include <vector>
using namespace std;
struct
{
double x0,y0,x1,y1;
}square[1010];
struct inf
{
double ll,rr,hh;
int key;
}line[2010];
int cmp(struct inf q,struct inf w)
{
return q.hh<w.hh;
}
double x[2010];
double tree[8200];
double trees[8200];
int treekey[8200];
int change(int l,int r,double ll,double rr,int now,int key)
{
if(x[l]>=ll&&rr>=x[r])
{
treekey[now]+=key;
if(treekey[now])
{
tree[now]=x[r]-x[l];
}
else if(l==r) tree[now]=0;
else
tree[now]=tree[now*2]+tree[now*2+1];
if(treekey[now]>1)
{
trees[now]=x[r]-x[l];
}
else if(l==r) trees[now]=0;
else if(treekey[now]==1)
{
trees[now]=tree[now*2]+tree[now*2+1];
}
else trees[now]=trees[now*2]+trees[now*2+1];
return 0;
}
int mid=(l+r)/2;
if(rr<=x[mid])
{
change( l, mid, ll, rr, now*2, key);
}
else if(ll>=x[mid])
{
change( mid, r, ll, rr, now*2+1, key);
}
else
{
change( l, mid, ll, rr, now*2, key);
change( mid, r, ll, rr, now*2+1, key);
}
if(treekey[now])
{
tree[now]=x[r]-x[l];
}
else if(l==r) tree[now]=0;
else
tree[now]=tree[now*2]+tree[now*2+1];
if(treekey[now]>1)
{
trees[now]=x[r]-x[l];
}
else if(l==r) trees[now]=0;
else if(treekey[now]==1)
{
trees[now]=tree[now*2]+tree[now*2+1];
}
else trees[now]=trees[now*2]+trees[now*2+1];
return 0;
}
int main()
{
int i,j,n,m,jishu=0;
scanf("%d",&jishu);
while(jishu--)
{
scanf("%d",&n);
if(n==0)
break;
for(i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf",&square[i].x0,&square[i].y0,&square[i].x1,&square[i].y1);
x[i]=square[i].x0;
x[i+n]=square[i].x1;
line[i].ll=square[i].x0;
line[i].rr=square[i].x1;
line[i].hh=square[i].y0;
line[i].key=1;
line[i+n].ll=square[i].x0;
line[i+n].rr=square[i].x1;
line[i+n].hh=square[i].y1;
line[i+n].key=-1;
}
sort(x,x+2*n);
sort(line,line+2*n,cmp);
m=unique(x,x+2*n)-x;
double ans=0;
for(i=0;i<2*n-1;i++)
{
change(0,m-1,line[i].ll,line[i].rr,1,line[i].key);
ans+=(line[i+1].hh-line[i].hh)*trees[1];
}
printf("%0.2lf\n",ans);
memset(tree,0,sizeof tree);
memset(trees,0,sizeof tree);
memset(treekey,0,sizeof treekey);
memset(x,0,sizeof x);
memset(line,0,sizeof line);
}
return 0;
}