func_code_string: #include <bits/stdc++.h>   using namespace std;   const double eps = 1e-10;   struct rec {     double x, y;   } a[110], s, e, f[2];   int g[2], n, m, i;   double ans;   double XJ(rec a, rec b, rec c) {     return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);   }   double dist(rec a, rec b) {     return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));   }   void cross(rec a, rec b, rec c, rec d) {     double t1 = XJ(a, c, b), t2 = XJ(a, b, d), t3 = XJ(c, a, d), t4 = XJ(c, d, b);     if (fabs(t1) < eps && fabs(t2) < eps) return;     if (fabs(dist(a, c) + dist(b, c) - dist(a, b)) < eps) {       f[m] = c;       g[m++] = i;       return;     }     if (t1 * t2 > eps && t3 * t4 > eps) {       f[m].x = (t1 * d.x + t2 * c.x) / (t1 + t2);       f[m].y = (t1 * d.y + t2 * c.y) / (t1 + t2);       g[m++] = i;       return;     }   }   double calc(int st, int ed, int s, int e) {     if (ed == 1)       ed = n;     else       ed--;     double ans = dist(f[s], a[st]);     for (int i = st; i != ed; i == n ? i = 1 : i++)       ans += dist(a[i], a[i == n ? 1 : i + 1]);     return ans + dist(a[ed], f[e]);   }   int main() {     scanf( %lf%lf%lf%lf%d , &s.x, &s.y, &e.x, &e.y, &n);     for (i = 1; i <= n; i++) cin >> a[i].x >> a[i].y;     a[0] = a[n];     for (i = 1; i <= n; i++) cross(s, e, a[i - 1], a[i]);     if (m > 1) {       if (dist(s, f[0]) > dist(s, f[1])) swap(f[0], f[1]), swap(g[0], g[1]);       ans = min(calc(g[0], g[1], 0, 1), calc(g[1], g[0], 1, 0));       ans = min(ans, 2 * dist(f[0], f[1]));       ans += dist(s, f[0]) + dist(f[1], e);     } else       ans = dist(s, e);     printf( %.10lf n , ans);     return 0;   }   