#include #include #include #include using namespace std; const double inf = 1e100, EPS = 1e-6; const int W = 20; double l, now; int n; struct wall { double x, y[6], val[5]; } w[W]; // big bug:double->int double length(double x1, double y1, double x2, double y2) { double x = x1 - x2, y = y1 - y2; return sqrt(x * x + y * y); } double cross(double x1, double y1, double x2, double y2) { return x1 * y2 - x2 * y1; } double same(double x0, double y0, double x3, double y3, double x1, double y1, double x2, double y2) { double x = x3 - x0, y = y3 - y0; // y0->x0 return cross(x, y, x1 - x0, y1 - y0) * cross(x, y, x2 - x0, y2 - y0); } // WA double 判断正负要用 int sign(double d) { if (fabs(d) < EPS) { return 0; } else return d > 0 ? 1 : -1; } bool ob(int li, int lj, int ri, int rj) { for (int i = li + 1; i < ri; i++) { for (int j = 0; j <= 4; j += 2) { // printf("(%.0lf,%.0lf)(%.0lf,%.0lf)/(%.0lf,%.0lf)(%.0lf,%.0lf):",w[i].x,w[i].y[j],w[i].x,w[i].y[j+1],w[li].x,w[li].y[lj],w[ri].x,w[ri].y[rj]); // printf("[%.2lf/%.2lf]\n",same(w[i].x,w[i].y[j],w[i].x,w[i].y[j+1],w[li].x,w[li].y[lj],w[ri].x,w[ri].y[rj]),same(w[li].x,w[li].y[lj],w[ri].x,w[ri].y[rj],w[i].x,w[i].y[j],w[i].x,w[i].y[j+1])); //两个都同方向才是,应该&&,错以为|| ,不是0都是真 两个小于0才是香蕉 if (sign(same(w[i].x, w[i].y[j], w[i].x, w[i].y[j + 1], w[li].x, w[li].y[lj], w[ri].x, w[ri].y[rj])) < 0 && sign(same(w[li].x, w[li].y[lj], w[ri].x, w[ri].y[rj], w[i].x, w[i].y[j], w[i].x, w[i].y[j + 1])) < 0) { return 0; } } } return 1; } void find(int ii, int jj) { for (int i = 0; i < ii; i++) { for (int j = 1; j <= 4; j++) { l = length(w[ii].x, w[ii].y[jj], w[i].x, w[i].y[j]); now = w[i].val[j] + l; // i j ii,jj搞反了 if (now < w[ii].val[jj] && ob(i, j, ii, jj)) { w[ii].val[jj] = now; } // printf("(%.0lf,%.0lf)(%.0lf,%.0lf):length:%.3lf,now:%.3lf,val:%.3lf\n",w[ii].x,w[ii].y[jj],w[i].x,w[i].y[j],l,now,w[ii].val[jj]); if (i == 0) break; } } } void doit() { for (int i = 1; i <= n; i++) { for (int j = 1; j <= 4; j++) { find(i, j); if (i == n) break; } } } int main() { while (1) { scanf("%d", &n); if (n == -1)//-1return return 0; memset(&w, 0, sizeof(wall) * (n + 1)); w[0].x = 0; w[0].y[1] = 5; w[0].val[1] = 0; for (int i = 1; i <= n; i++) { w[i].y[0] = 0; w[i].y[5] = 10; for (int j = 1; j <= 4; j++) //又打成i { w[i].val[j] = inf; } } for (int i = 1; i <= n; i++) { scanf("%lf", &w[i].x); // cin>>w[i].x; for (int j = 1; j <= 4; j++) // 又是j { scanf("%lf", &w[i].y[j]); // cin>>w[i].y[j]; } } w[++n].x = 10; w[n].y[1] = 5; w[n].val[1] = inf; // bug 没赋值 doit(); printf("%.2lf\n", w[n].val[1]); } return 0; }