/* * @Author: NanoApe * @Date: 2019-08-17 17:59:32 * @Last Modified by: NanoApe * @Last Modified time: 2019-08-17 19:30:02 */ #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define rep(i, l, r) for(int i=l; i<=r; i++) #define dow(i, l, r) for(int i=l; i>=r; i--) #define fi first #define se second #define pb push_back #define mp make_pair #define clr(x, c) memset(x,c,sizeof(x)) typedef long long ll; typedef unsigned long long ull; typedef pair Pii; inline int read() { int x=0,f=0; char ch=getchar(); while (ch<'0' || '9' v; map mx, my; int numx[maxS], numy[maxS]; double d[maxS][maxS]; int C[maxS][maxS], U[maxS][maxS], D[maxS][maxS], R[maxS][maxS], L[maxS][maxS]; bool tag[maxS][maxS]; queue q; int main() { int T = read(); while (T--) { int n = read(); rep(i, 1, n) x1[i] = read(), y1[i]=read(), x2[i]=read(), y2[i]=read(); int xa = read(), ya = read(), xb = read(), yb = read(); int xRange = 0; v.clear(); mx.clear(); rep(i, 1, n) v.push_back(x1[i]), v.push_back(x2[i]); v.push_back(xa); v.push_back(xb); sort(v.begin(), v.end()); rep(i, 0, (int)(v.size())-1) { if (i == 0 || v[i] != v[i-1]) xRange++; numx[xRange] = v[i]; mx[v[i]] = xRange; } int yRange = 0; v.clear(); my.clear(); rep(i, 1, n) v.push_back(y1[i]), v.push_back(y2[i]); v.push_back(ya); v.push_back(yb); sort(v.begin(), v.end()); rep(i, 0, (int)(v.size())-1) { if (i == 0 || v[i] != v[i-1]) yRange++; numy[yRange] = v[i]; my[v[i]] = yRange; } clr(U,0); clr(D,0); clr(L,0); clr(R,0); clr(C,0); rep(o, 1, n) { x1[o] = mx[x1[o]]; y1[o] = my[y1[o]]; x2[o] = mx[x2[o]]; y2[o] = my[y2[o]]; rep(i, x1[o]+1, x2[o]-1) rep(j, y1[o]+1, y2[o]-1) C[i][j]++; rep(j, y1[o], y2[o]-1) U[x1[o]][j]++, U[x2[o]][j]++; rep(i, x1[o]+1, x2[o]-1) U[i][y1[o]]++; rep(j, y1[o]+1, y2[o]) D[x1[o]][j]++, D[x2[o]][j]++; rep(i, x1[o]+1, x2[o]-1) D[i][y2[o]]++; rep(i, x1[o]+1, x2[o]) L[i][y1[o]]++, L[i][y2[o]]++; rep(j, y1[o]+1, y2[o]-1) L[x2[o]][j]++; rep(i, x1[o], x2[o]-1) R[i][y1[o]]++, R[i][y2[o]]++; rep(j, y1[o]+1, y2[o]-1) R[x1[o]][j]++; } xa = mx[xa]; ya = my[ya]; xb = mx[xb]; yb = my[yb]; rep(i, 1, xRange) rep(j, 1, yRange) d[i][j] = 1e100, tag[i][j] = false; d[xa][ya] = 0, tag[xa][ya] = true; q.push(make_pair(xa, ya)); while (!q.empty()) { Pii a = q.front(); q.pop(); int x = a.fi, y = a.se; tag[x][y] = false; if (y+1 <= yRange && d[x][y+1] > d[x][y]+1.*(numy[y+1]-numy[y])/(C[x][y]+U[x][y]+1)) { d[x][y+1] = d[x][y]+1.*(numy[y+1]-numy[y])/(C[x][y]+U[x][y]+1); if (!tag[x][y+1]) {q.push(make_pair(x, y+1)), tag[x][y+1] = 1;}} if (y-1 >= 1 && d[x][y-1] > d[x][y]+1.*(numy[y]-numy[y-1])/(C[x][y]+D[x][y]+1)) { d[x][y-1] = d[x][y]+1.*(numy[y]-numy[y-1])/(C[x][y]+D[x][y]+1); if (!tag[x][y-1]) {q.push(make_pair(x, y-1)), tag[x][y-1] = 1;}} if (x-1 >= 1 && d[x-1][y] > d[x][y]+1.*(numx[x]-numx[x-1])/(C[x][y]+L[x][y]+1)) { d[x-1][y] = d[x][y]+1.*(numx[x]-numx[x-1])/(C[x][y]+L[x][y]+1); if (!tag[x-1][y]) {q.push(make_pair(x-1, y)), tag[x-1][y] = 1;}} if (x+1 <= xRange && d[x+1][y] > d[x][y]+1.*(numx[x+1]-numx[x])/(C[x][y]+R[x][y]+1)) { d[x+1][y] = d[x][y]+1.*(numx[x+1]-numx[x])/(C[x][y]+R[x][y]+1); if (!tag[x+1][y]) {q.push(make_pair(x+1, y)), tag[x+1][y] = 1;}} } printf("%.5lf\n", d[xb][yb]); } }