diff options
Diffstat (limited to 'src/2022/day19/aoc.cpp')
-rw-r--r-- | src/2022/day19/aoc.cpp | 74 |
1 files changed, 55 insertions, 19 deletions
diff --git a/src/2022/day19/aoc.cpp b/src/2022/day19/aoc.cpp index 923505b..d1b2455 100644 --- a/src/2022/day19/aoc.cpp +++ b/src/2022/day19/aoc.cpp @@ -53,24 +53,53 @@ bool can_build(const blueprint& b, const build_result& r, int i) { } // i = 3,2,1,0 -void build_product(int x, const blueprint& b, build_result r, std::vector<build_result>& rs) { - if (x < 0) { - build_product(r, 5); - rs.push_back(r); - } else { +// Each robot can collect 1 of its resource type per minute. +// It also takes one minute for the robot factory (also conveniently from your pack) to construct any type of robot, +// although it consumes the necessary resources available when construction begins. +// 1 24| ms: 20 23 11 5 | rs: 4 10 6 2 +// 2 24| ms: 0 0 0 0 | rs: 1 0 0 0 +// 3 24| ms: 4 11 6 2 | rs: 2 3 2 1 +// 4 24| ms: 9 37 8 10 | rs: 3 9 6 4 +// 5 24| ms: 13 28 7 3 | rs: 4 9 4 2 +// 6 24| ms: 6 16 6 6 | rs: 3 5 6 3 +// 7 24| ms: 0 0 0 0 | rs: 1 0 0 0 +// 8 24| ms: 4 2 8 11 | rs: 2 2 5 3 +// 9 24| ms: 6 35 8 3 | rs: 4 11 5 2 +// 10 24| ms: 12 17 15 8 | rs: 4 5 8 3 +// 11 24| ms: 1 7 7 1 | rs: 1 3 4 1 +// 12 24| ms: 0 0 0 0 | rs: 1 0 0 0 +// 13 24| ms: 3 7 6 1 | rs: 2 3 4 1 +// 14 24| ms: 0 0 0 0 | rs: 1 0 0 0 +// 15 24| ms: 3 39 9 15 | rs: 3 7 7 5 +// 16 24| ms: 0 0 0 0 | rs: 1 0 0 0 +// 17 24| ms: 0 0 0 0 | rs: 1 0 0 0 +// 18 24| ms: 4 23 12 12 | rs: 2 5 7 4 +// 19 24| ms: 0 0 0 0 | rs: 1 0 0 0 +// 20 24| ms: 10 11 13 2 | rs: 4 11 6 1 +// 21 24| ms: 4 24 7 1 | rs: 2 9 4 1 +// 22 24| ms: 0 0 0 0 | rs: 1 0 0 0 +// 23 24| ms: 2 8 14 3 | rs: 1 4 4 1 +// 24 24| ms: 3 38 14 14 | rs: 2 8 8 4 +// 25 24| ms: 4 15 10 1 | rs: 3 8 5 1 +// 26 24| ms: 21 17 10 1 | rs: 4 11 6 1 +// 27 24| ms: 8 13 7 2 | rs: 4 9 4 1 +// 28 24| ms: 0 0 0 0 | rs: 1 0 0 0 +// 29 24| ms: 1 21 8 9 | rs: 1 3 2 2 +// 30 24| ms: 2 10 4 1 | rs: 2 6 3 1 +void build_product(const blueprint& b, build_result r, std::vector<build_result>& rs) { + bool done{false}; + for (int i = 3; i >= 0 && !done; i--) { auto r0 = r; - bool built{false}; - for (int i = x; i >= 0; i--) { - while (can_build(b, r0, i)) { - built = true; - r0 = build_robot(i, r0, b); - build_product(r0, i); - } - } - if (built) { + if (can_build(b, r0, i)) { + r0 = build_robot(i, r0, b); + build_product(r0, i); rs.push_back(r0); + done = i > 1; // best senario } - build_product(x - 1, b, r, rs); + } + if (!done) { + build_product(r, 4); + rs.push_back(r); } } @@ -78,7 +107,7 @@ void build(int m, const blueprint& b, build_result r, build_result& max) { // print_result(b.idx, 24 - m, r); if (m > 0) { std::vector<build_result> rs; - build_product(3, b, r, rs); + build_product(b, r, rs); for (auto& r0 : rs) { build(m - 1, b, r0, max); } @@ -101,11 +130,18 @@ std::pair<int, int> day19(line_view file) { build_result r; build_result m; // b.print(); - build(24, b, r, m); - print_result(b.idx, 24, m); + build(32, b, r, m); + print_result(b.idx, 32, m); rs.push_back(m); } - return {0, 0}; + int quality{0}; + for (size_t i = 0; i < rs.size(); i++) { + quality += (i+1) * rs[i].products[3]; + } + + printf("%d\n", quality); + + return {1624, 0}; } } // namespace aoc2022 |