aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2023-01-13 17:49:18 +0800
committerkaiwu <kaiwu2004@gmail.com>2023-01-13 17:49:18 +0800
commit69f52cc26954094f3725ec63597c2a43ada51d69 (patch)
tree6e132eeeda05b18b427ff43181acf74f3c031ffe
parent5b4403c08297c5742a7cef0434902f390be505f1 (diff)
downloadadvent-of-code-69f52cc26954094f3725ec63597c2a43ada51d69.tar.gz
advent-of-code-69f52cc26954094f3725ec63597c2a43ada51d69.zip
2022 day19 part1 need
-rw-r--r--src/2022/day19/aoc.cpp43
-rw-r--r--src/2022/day19/aoc.h10
2 files changed, 36 insertions, 17 deletions
diff --git a/src/2022/day19/aoc.cpp b/src/2022/day19/aoc.cpp
index 7124873..7ccac05 100644
--- a/src/2022/day19/aoc.cpp
+++ b/src/2022/day19/aoc.cpp
@@ -1,4 +1,5 @@
#include "aoc.h"
+#include <set>
namespace aoc2022 {
@@ -17,9 +18,9 @@ void print_result(int i, int m, const build_result& r) {
bool can_build(int i, const build_result& r, const blueprint& b) {
switch (i) {
case 0:
- return r.products[0] >= b.c_ore_r;
+ return r.products[0] >= b.c_ore_r[0];
case 1:
- return r.products[0] >= b.c_clay_r;
+ return r.products[0] >= b.c_clay_r[0];
case 2:
return r.products[0] >= b.c_obsi_r[0] && r.products[1] >= b.c_obsi_r[1];
case 3:
@@ -33,11 +34,11 @@ bool can_build(int i, const build_result& r, const blueprint& b) {
build_result build_robot(int i, build_result r, const blueprint& b) {
switch (i) {
case 0:
- r.products[0] -= b.c_ore_r;
+ r.products[0] -= b.c_ore_r[0];
r.robots[0] += 1;
break;
case 1:
- r.products[0] -= b.c_clay_r;
+ r.products[0] -= b.c_clay_r[0];
r.robots[1] += 1;
break;
case 2:
@@ -62,22 +63,40 @@ void build_product(build_result& r, int x) {
}
}
-std::vector<int> to_build(const blueprint& b, const build_result& r) {
- std::vector<int> xs;
- for (int i = 3; i >= 0; i--) {
- if (can_build(i, r, b)) {
- xs.push_back(i);
+int required(const blueprint& b, int i) {
+ switch (i) {
+ case 0:
+ return 0;
+ case 1:
+ return 0;
+ case 2:
+ return b.c_obsi_r[1];
+ case 3:
+ return b.c_geod_r[1];
+ default:
+ break;
+ }
+ return 0;
+}
+
+std::set<int> to_build(const blueprint& b, const build_result& r) {
+ int need{3}; // 0, 1, 2, 3
+ while (need > 0) {
+ auto c = can_build(need, r, b);
+ if (c || (r.products[need - 1] >= required(b, need))) {
+ break;
}
+ need--;
}
- xs.push_back(INT32_MAX);
- return xs;
+ // printf("need %d\n", need);
+ return can_build(need, r, b) ? std::set<int>{need} : std::set<int>{INT32_MAX};
}
void build(int m, const blueprint& b, build_result r, build_result& max) {
if (m > 0) {
// print_result(b.idx, 24 - m, r);
auto is = to_build(b, r);
- for (int i : is) {
+ for (auto i : is) {
if (i != INT32_MAX) {
auto r0 = build_robot(i, r, b);
build_product(r0, i);
diff --git a/src/2022/day19/aoc.h b/src/2022/day19/aoc.h
index 9b08565..0ccb21b 100644
--- a/src/2022/day19/aoc.h
+++ b/src/2022/day19/aoc.h
@@ -6,11 +6,11 @@ namespace aoc2022 {
// which blueprint would maximize the number of opened geodes after 24 minutes
// by figuring out which robots to build and when to build them.
// geod <- obsi <- clay <- ore
-// ore ore
+// ore ore
struct blueprint {
int idx = 0;
- int c_ore_r = 0; // ore
- int c_clay_r = 0; // ore
+ int c_ore_r[2] = {0, 0}; // ore
+ int c_clay_r[2] = {0, 0}; // ore
int c_obsi_r[2] = {0, 0}; // ore + clay
int c_geod_r[2] = {0, 0}; // ore + obsidian
@@ -24,13 +24,13 @@ struct blueprint {
}
void print() const noexcept {
- printf("%d: %d %d [%d,%d] [%d,%d]\n", idx, c_ore_r, c_clay_r, c_obsi_r[0], c_obsi_r[1], c_geod_r[0], c_geod_r[1]);
+ printf("%d: %d %d [%d,%d] [%d,%d]\n", idx, c_ore_r[0], c_clay_r[0], c_obsi_r[0], c_obsi_r[1], c_geod_r[0], c_geod_r[1]);
}
blueprint(line_view lv) {
const char* p = lv.line;
int i{0};
- int* ps[7] = {&idx, &c_ore_r, &c_clay_r, c_obsi_r, c_obsi_r + 1, c_geod_r, c_geod_r + 1};
+ int* ps[7] = {&idx, c_ore_r, c_clay_r, c_obsi_r, c_obsi_r + 1, c_geod_r, c_geod_r + 1};
while (p < lv.line + lv.length) {
if (*p >= '0' && *p <= '9') {