#include #define M 450 #define db double #define FindX(x) lower_bound(X+1,X+lx+1,x)-X #define FindY(x) lower_bound(Y+1,Y+ly+1,x)-Y using namespace std; bool __1; int n; int X[M],Y[M],lx,ly; struct node{ int x1,y1,x2,y2; }A[M]; int sx,sy,ex,ey; int id(int x,int y){ return y+ly*(x-1); } struct edge{ int to,fr;db co; }E[M*M*4]; int lst[M*M],tote; void addedge(int a,int b,db c){ E[++tote]=(edge){b,lst[a],c}; lst[a]=tote; } const int rx[]={1,0}; const int ry[]={0,1}; bool In(db x,db y,node &a){ return (db)X[a.x1]<=x&&x<=(db)X[a.x2]&&(db)Y[a.y1]<=y&&y<=(db)Y[a.y2]; } int Cov(db x,db y){ int c=1; // printf("%lf %lf\n",x,y); for(int i=1;i<=n;i++)c+=In(x,y,A[i]); return c; } void Build(){ for(int i=1;i<=lx;i++) for(int j=1;j<=ly;j++){ for(int a=0;a<2;a++){ int x=i+rx[a],y=j+ry[a]; if(x>lx||y>ly)continue; int t=Cov((X[i]+X[x])/2.0,(Y[j]+Y[y])/2.0); db c=1.0*(abs(X[i]-X[x])+abs(Y[j]-Y[y]))/t; addedge(id(i,j),id(x,y),c); // printf("(%d %d) -- (%d %d) %.5lf\n",X[i],Y[j],X[x],Y[y],c); addedge(id(x,y),id(i,j),c); } } } struct Heap{ db d;int x; bool operator <(const Heap &_)const{ return d>_.d; } }; priority_queueQ; db dis[M*M]; bool vis[M*M]; void Work(){ for(int i=1;i<=lx;i++) for(int j=1;j<=ly;j++){ dis[id(i,j)]=2e30; vis[id(i,j)]=0; } Q.push((Heap){0,id(sx,sy)}); dis[id(sx,sy)]=0; while(!Q.empty()){ int v=Q.top().x;Q.pop(); if(vis[v])continue; vis[v]=1; for(int i=lst[v];i;i=E[i].fr){ int u=E[i].to; if(dis[u]>dis[v]+E[i].co){ dis[u]=dis[v]+E[i].co; Q.push((Heap){dis[u],u}); } } } printf("%.5lf\n",dis[id(ex,ey)]); } void reset(){ for(int i=1;i<=lx;i++) for(int j=1;j<=ly;j++) lst[id(i,j)]=0; lx=ly=0;tote=0; } bool __2; int main(){ for(int _=(scanf("%d",&_),_);_;_--){ reset(); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d%d%d",&A[i].x1,&A[i].y1,&A[i].x2,&A[i].y2); X[++lx]=A[i].x1,X[++lx]=A[i].x2; Y[++ly]=A[i].y1,Y[++ly]=A[i].y2; } scanf("%d%d%d%d",&sx,&sy,&ex,&ey); X[++lx]=sx,X[++lx]=ex; Y[++ly]=sy,Y[++ly]=ey; sort(X+1,X+lx+1);lx=unique(X+1,X+lx+1)-X-1; sort(Y+1,Y+ly+1);ly=unique(Y+1,Y+ly+1)-Y-1; sx=FindX(sx),ex=FindX(ex); sy=FindY(sy),ey=FindY(ey); for(int i=1;i<=n;i++){ A[i].x1=FindX(A[i].x1); A[i].x2=FindX(A[i].x2); A[i].y1=FindY(A[i].y1); A[i].y2=FindY(A[i].y2); } Build(); Work(); } return 0; }