#include #include #include struct Point { int x, y; }; struct Line { struct Point a, b; }; static void normalize(struct Line *l) { if (l->a.x > l->b.x || l->a.y > l->b.y) { struct Point p = l->a; l->a = l->b; l->b = p; } } static size_t parse(struct Line *lines) { char dir; int dist; size_t len = 0; struct Point point = { 0, 0 }; while (EOF != scanf("%c%d,", &dir, &dist)) { if (dir == '\n') break; lines[len].a = point; switch (dir) { break; case 'U': point.y += dist; break; case 'D': point.y -= dist; break; case 'L': point.x -= dist; break; case 'R': point.x += dist; break; default: abort(); } lines[len].b = point; normalize(&lines[len++]); } return len; } static int intersect(struct Point *p, struct Line v, struct Line h) { if (v.a.x != v.b.x) { struct Line l = v; v = h; h = l; } if (v.a.y == v.b.y) return 0; if (h.a.x == h.b.x) return 0; if (h.a.y < v.a.y) return 0; if (h.a.y > v.b.y) return 0; if (h.a.x > v.a.x) return 0; if (h.b.x < v.a.x) return 0; p->x = v.a.x; p->y = h.a.y; return 1; } int main(void) { struct Line aLines[512]; struct Line bLines[512]; size_t aLen = parse(aLines); size_t bLen = parse(bLines); int min = INT_MAX; for (size_t a = 0; a < aLen; ++a) { for (size_t b = 0; b < bLen; ++b) { struct Point p; if (!intersect(&p, aLines[a], bLines[b])) continue; if (!p.x && !p.y) continue; int dist = abs(p.x) + abs(p.y); if (dist < min) min = dist; } } printf("%d\n", min); }