#include #include #include #include using namespace std; const int N = 12; const int K = 14; const double EPS = 1e-12; static complex zp[N+1]; static complex zq[N+1]; static int n; static map cache[N+1]; #define Z(i,s) (zp[i] * (1.0 - (s)) + zq[i] * (s)) int cmp(double x, double y) { if(x - y > EPS) return +1; if(y - x > EPS) return -1; return 0; } double compute(int i, double s) { if(i == 1) { complex z = Z(1,s); complex w = (z - zp[0]) / (zq[0] - zp[0]); if(real(w) < 0.0) return abs(z - zp[0]); if(real(w) > 1.0) return abs(z - zq[0]); return abs(imag(w)) * abs(zq[0] - zp[0]); } if(cache[i].find(s) != cache[i].end()) return cache[i][s]; double mul = (i == n) ? 0.0 : 1.0; double su = 0.0; double sv = 1.0; double dmin; for(int k = 0; k < K; k++) { double d[5]; for(int j = 0; j <= 4; j++) { double t = (su * (4 - j) + sv * j) / 4.0; d[j] = mul * abs(Z(i,s) - Z(i-1,t)) + compute(i-1, t); } int m = min_element(d, d + 5) - d; dmin = d[m]; int m0 = max(1, min(m, 3)); if(cmp(d[m0-1], dmin) == 0 && cmp(d[m0+1], dmin) == 0) { break; } int mu = max(0, m - 1); int mv = min(4, m + 1); double su1 = (su * (4 - mu) + sv * mu) / 4.0; double sv1 = (su * (4 - mv) + sv * mv) / 4.0; su = su1; sv = sv1; if(mv - mu == 1) { k++; } } cache[i][s] = dmin; return dmin; } int main(void) { while(cin >> n, n != 0) { for(int i = 0; i < n; i++) { double x, y; cin >> x >> y; zp[i] = complex(x, y); cin >> x >> y; zq[i] = complex(x, y); } zp[n] = zq[n] = 0.0; cout << setprecision(15) << compute(n, 0.0) << endl; for(int i = 0; i <= n; i++) cache[i].clear(); } return 0; }