#include using namespace std; typedef long long LL; #define N 509 struct Node { int x1, y1, x2, y2; } a[N]; int n, m, xx, yy; map X, Y; int rx[N], ry[N]; int cx[N][N], cy[N][N]; int id[N][N]; struct Edge { int v; double w; }; vector E[N * N]; void add(int u, int v, double w) { E[u].push_back({v, w}); E[v].push_back({u, w}); } double dis[N * N]; priority_queue < pair, vector < pair >, greater< pair > > q; double dij(int sx, int sy, int ex, int ey) { int s = id[sx][sy], e = id[ex][ey]; for (int i = 1; i <= m; i++) dis[i] = 1e10; dis[s] = 0; q.push({0., s}); while (!q.empty()) { pair u = q.top(); q.pop(); if (dis[u.second] != u.first) continue; int x = u.second; double d = u.first; for (auto v : E[x]) { if (dis[v.v] > d + v.w) { dis[v.v] = d + v.w; q.push({dis[v.v], v.v}); } } } return dis[e]; } void work() { X.clear(); Y.clear(); for (int i = 0; i <= xx; i++) { for (int j = 0; j <= yy; j++) { cx[i][j] = cy[i][j] = 0; } } xx = yy = 0; scanf("%d", &n); for (int i = 1; i <= n + 1; i++) { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); X[x1] = 0; X[x2] = 0; Y[y1] = 0; Y[y2] = 0; a[i] = {x1, y1, x2, y2}; } for (auto &i : X) rx[i.second = ++xx] = i.first; for (auto &i : Y) ry[i.second = ++yy] = i.first; for (int i = 1; i <= n; i++) { int x1, y1, x2, y2; x1 = X[a[i].x1]; x2 = X[a[i].x2]; y1 = Y[a[i].y1]; y2 = Y[a[i].y2]; for (int x = x1; x <= x2; x++) { for (int y = y1; y < y2; y++) { cx[x][y]++; } } for (int y = y1; y <= y2; y++) { for (int x = x1; x < x2; x++) { cy[x][y]++; } } } m = 0; for (int i = 1; i <= xx; i++) { for (int j = 1; j <= yy; j++) { id[i][j] = ++m; } } for (int i = 1; i <= m; i++) E[i].clear(); for (int i = 1; i <= xx; i++) { for (int j = 1; j <= yy; j++) { if (i < xx) { add(id[i][j], id[i + 1][j], double(rx[i + 1] - rx[i]) / (cy[i][j] + 1)); // cerr << rx[i] << " " << ry[j] << " -> " << rx[i + 1] << " " << ry[j] << " : " << double(rx[i + 1] - rx[i]) / (cy[i][j] + 1) << endl; } if (j < yy) { add(id[i][j], id[i][j + 1], double(ry[j + 1] - ry[j]) / (cx[i][j] + 1)); // cerr << rx[i] << " " << ry[j] << " -> " << rx[i] << " " << ry[j + 1] << " : " << double(ry[i + 1] - ry[i]) / (cx[i][j] + 1) << endl; } } } printf("%.5lf\n", dij(X[a[n + 1].x1], Y[a[n + 1].y1], X[a[n + 1].x2], Y[a[n + 1].y2])); } int main() { int T; cin >> T; while (T--) work(); }