diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-12-14 22:32:20 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-12-14 22:32:20 +0800 |
commit | 363e289eb2b54757e52dc93efa3090c763a8aa39 (patch) | |
tree | c0965fb434472c3543beba5cdd976c03da86611f /src | |
parent | c277bc6e370bc5ee8899055a112978c76c1e7b19 (diff) | |
download | advent-of-code-363e289eb2b54757e52dc93efa3090c763a8aa39.tar.gz advent-of-code-363e289eb2b54757e52dc93efa3090c763a8aa39.zip |
2022 day14
Diffstat (limited to 'src')
-rw-r--r-- | src/2022/day14/aoc.cpp | 40 | ||||
-rw-r--r-- | src/2022/day14/aoc.h | 27 |
2 files changed, 58 insertions, 9 deletions
diff --git a/src/2022/day14/aoc.cpp b/src/2022/day14/aoc.cpp index 00bc0c8..614c432 100644 --- a/src/2022/day14/aoc.cpp +++ b/src/2022/day14/aoc.cpp @@ -3,11 +3,11 @@ namespace aoc2022 { rock::three rock::t3; -int fall1(cave& cv) { +int fall1(cave& cv, int dx) { bool fall{true}; int n{0}; - while(fall) { - auto p = cv.drop(cv.to({500,0})); + while (fall) { + auto p = cv.drop(cv.to({500,0}, dx)); rock::pos ns[] = {{p.x, p.y + 1}, {p.x - 1, p.y + 1}, {p.x + 1, p.y + 1}}; for (int i = 0; i < 3; i++) { if (!cv.valid(ns[i])) { @@ -22,8 +22,20 @@ int fall1(cave& cv) { return n; } -int fall2(cave& cv) { - return 0; +int fall2(cave& cv, int dx) { + bool fall{true}; + int n{0}; + while (fall) { + auto p0 = cv.to({500,0}, dx); + auto p = cv.drop(p0); + + cv.get(p) = 'o'; + n++; + if (p.x == p0.x && p.y == p0.y) { + fall = false; + } + } + return n; } std::pair<int, int> day14(line_view file) { @@ -34,14 +46,24 @@ std::pair<int, int> day14(line_view file) { }); // printf("%d %d %d\n", rock::t3.minx, rock::t3.maxx, rock::t3.maxy); - cave cv(rock::t3.maxx - rock::t3.minx, rock::t3.maxy); + cave cv1(rock::t3.maxx - rock::t3.minx, rock::t3.maxy); + cave cv2(2 * (rock::t3.maxy + 2), rock::t3.maxy + 2); + int dx = (rock::t3.maxy + 2) - (500 - rock::t3.minx); for(auto& r: rocks) { // r.print(); - cv.mark(r); + cv1.mark(r); + cv2.mark(r, dx); + } + auto n1 = fall1(cv1, 0); + + for(int i = 0; i < cv2.width; i++) { + cv2.get({i, cv2.height - 1}) = '#'; } - cave cv2{cv}; - return {fall1(cv), fall2(cv2)}; + auto n2 = fall2(cv2, dx); + // cv2.print(); + + return {n1, n2}; } } diff --git a/src/2022/day14/aoc.h b/src/2022/day14/aoc.h index d2143f6..fa4412c 100644 --- a/src/2022/day14/aoc.h +++ b/src/2022/day14/aoc.h @@ -81,6 +81,10 @@ struct cave { return {p.x - rock::t3.minx, p.y}; } + rock::pos to(rock::pos p, int dx) { + return {p.x - rock::t3.minx + dx, p.y}; + } + char& get(rock::pos p) const noexcept { return *(space + p.y * width + p.x); } @@ -122,6 +126,29 @@ struct cave { } } + void mark(rock& r, int dx) { + for (size_t i = 0; i < r.rs.size() - 1 ; i++) { + auto r1 = r.rs[i]; + auto r2 = r.rs[i+1]; + if (r1.x == r2.x) { + int min = r1.y < r2.y ? r1.y : r2.y; + int max = r1.y > r2.y ? r1.y : r2.y; + for (int j = min; j <= max; j++) { + auto p = to({r1.x, j}, dx); + get(p) = '#'; + } + } + if (r1.y == r2.y) { + int min = r1.x < r2.x ? r1.x : r2.x; + int max = r1.x > r2.x ? r1.x : r2.x; + for (int j = min; j <= max; j++) { + auto p = to({j, r1.y}, dx); + get(p) = '#'; + } + } + } + } + void print() const noexcept { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { |