aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-12-14 22:32:20 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-12-14 22:32:20 +0800
commit363e289eb2b54757e52dc93efa3090c763a8aa39 (patch)
treec0965fb434472c3543beba5cdd976c03da86611f /src
parentc277bc6e370bc5ee8899055a112978c76c1e7b19 (diff)
downloadadvent-of-code-363e289eb2b54757e52dc93efa3090c763a8aa39.tar.gz
advent-of-code-363e289eb2b54757e52dc93efa3090c763a8aa39.zip
2022 day14
Diffstat (limited to 'src')
-rw-r--r--src/2022/day14/aoc.cpp40
-rw-r--r--src/2022/day14/aoc.h27
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++) {