func_code_string: #include <bits/stdc++.h>   using namespace std;   int n;   const double Exp = 1e-9;   int sgn(double x) {     if (fabs(x) < Exp) return 0;     return x > 0 ? 1 : -1;   }   struct Point {     double x, y;     Point(double x = 0, double y = 0) : x(x), y(y) {}     friend Point operator+(const Point &a, const Point &b) {       return Point(a.x + b.x, a.y + b.y);     }     friend Point operator-(const Point &a, const Point &b) {       return Point(a.x - b.x, a.y - b.y);     }     friend Point operator*(const Point &a, double b) {       return Point(a.x * b, a.y * b);     }     friend Point operator/(const Point &a, double b) {       return Point(a.x / b, a.y / b);     }     Point rotate(double del) {       return Point(x * cos(del) - y * sin(del), x * sin(del) + y * cos(del));     }   } s, t, island[40];   vector<Point> vec;   double Dot(const Point &a, const Point &b) { return a.x * b.x + a.y * b.y; }   double Cross(const Point &a, const Point &b) { return a.x * b.y - a.y * b.x; }   double Length(const Point &a) { return sqrt(Dot(a, a)); }   struct Line {     Point p, v;     Line(Point p, Point v) : p(p), v(v) {}     Point get_point(double t) { return p + v * t; }   };   Point get_line_intersection(const Line &l1, const Line &l2) {     Point a = l1.p, b = l1.p + l1.v;     Point c = l2.p, d = l2.p + l2.v;     double u = Cross(d - a, c - a), v = Cross(c - b, d - b);     double t = u / (u + v);     return a + (b - a) * t;   }   int if_point_on_line(const Point &p, const Point &st, const Point &ed) {     return sgn(Cross(p - st, ed - st)) == 0;   }   int if_point_on_ray(const Point &p, const Point &st, const Point &ed) {     if (sgn(Cross(p - st, ed - st)) != 0) return 0;     if (sgn(Dot(p - st, ed - st)) < 0) return 0;     return 1;   }   int if_point_on_segment(const Point &p, const Point &st, const Point &ed) {     return if_point_on_ray(p, st, ed) && if_point_on_ray(p, ed, st);   }   int main() {     cin >> s.x >> s.y >> t.x >> t.y;     cin >> n;     for (int i = 0; i < n; i++) {       cin >> island[i].x >> island[i].y;     }     double sum = 0;     int flag = 0;     int cnt = 0;     for (int i = 0; i < n; i++) {       int l = i, r = i + 1;       r %= n;       sum += Length(island[r] - island[l]);     }     for (int i = 0; i < n; i++) {       int l = i, r = i + 1;       r %= n;       if (flag == 1 && cnt < 2) vec.push_back(island[l]);       Point now;       if (sgn(Cross(s - t, island[r] - island[l])) != 0) {         now = get_line_intersection(Line(s, t - s),                                     Line(island[r], island[l] - island[r]));         if (if_point_on_segment(now, island[l], island[r])) {           if ((vec.size() > 0 && sgn(Length(vec[vec.size() - 1] - now)) != 0) ||               vec.size() == 0) {             if (if_point_on_segment(now, s, t)) {               cnt++;               flag = 1;               vec.push_back(now);               if (cnt == 2) break;             }           }         }       } else if (if_point_on_line(island[l], s, t)) {         flag = 2;         break;       }     }     if (flag == 2 || cnt == 0) {       double ans = Length(s - t);       printf( %.9lf n , ans);       return 0;     }     double edge_len = 0;     for (int i = 1; i < vec.size(); i++) {       edge_len += Length(vec[i] - vec[i - 1]);     }     edge_len = min(edge_len, sum - edge_len);     double s_len = min(Length(s - vec[0]), Length(s - vec[vec.size() - 1]));     double t_len = min(Length(t - vec[0]), Length(t - vec[vec.size() - 1]));     double ans1 = edge_len + s_len + t_len;     double rest_len = Length(s - t);     rest_len -= s_len + t_len;     double ans2 = s_len + t_len + 2 * rest_len;     double ans = min(ans1, ans2);     printf( %.9lf n , ans);     return 0;   }   