diff options
-rw-r--r-- | 2019/day03.c | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/2019/day03.c b/2019/day03.c index 5d45bc0..6336ff7 100644 --- a/2019/day03.c +++ b/2019/day03.c @@ -10,14 +10,6 @@ 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; @@ -33,13 +25,22 @@ static size_t parse(struct Line *lines) { break; case 'R': point.x += dist; break; default: abort(); } - lines[len].b = point; - normalize(&lines[len++]); + lines[len++].b = point; } return len; } +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 int intersect(struct Point *p, struct Line v, struct Line h) { + normalize(&v); + normalize(&h); if (v.a.x != v.b.x) { struct Line l = v; v = h; @@ -56,6 +57,10 @@ static int intersect(struct Point *p, struct Line v, struct Line h) { return 1; } +static int length(struct Line l) { + return abs(l.b.x - l.a.x) + abs(l.b.y - l.a.y); +} + int main(void) { struct Line aLines[512]; struct Line bLines[512]; @@ -73,4 +78,22 @@ int main(void) { } } printf("%d\n", min); + + min = INT_MAX; + int aSteps = 0; + for (size_t a = 0; a < aLen; ++a) { + int bSteps = 0; + for (size_t b = 0; b < bLen; ++b) { + struct Point p; + if (intersect(&p, aLines[a], bLines[b]) && !(!p.x && !p.y)) { + int steps = aSteps + bSteps; + steps += length((struct Line) { aLines[a].a, p }); + steps += length((struct Line) { bLines[b].a, p }); + if (steps < min) min = steps; + } + bSteps += length(bLines[b]); + } + aSteps += length(aLines[a]); + } + printf("%d\n", min); } |