diff options
author | kaiwu <kaiwu2004@gmail.com> | 2023-01-10 22:46:28 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2023-01-10 22:46:28 +0800 |
commit | 4cb1155522ee3a4bc59583ff1858b2670d4cc356 (patch) | |
tree | f457a4733f694bccf698a2e7882ff03dc7b3ca21 /src/2022/day16/aoc.cpp | |
parent | 2b81cfc18ddc268a26ccb260760e14ed0384c99e (diff) | |
download | advent-of-code-4cb1155522ee3a4bc59583ff1858b2670d4cc356.tar.gz advent-of-code-4cb1155522ee3a4bc59583ff1858b2670d4cc356.zip |
2022 day16 part1
Diffstat (limited to 'src/2022/day16/aoc.cpp')
-rw-r--r-- | src/2022/day16/aoc.cpp | 77 |
1 files changed, 38 insertions, 39 deletions
diff --git a/src/2022/day16/aoc.cpp b/src/2022/day16/aoc.cpp index 05e1d47..5ef909f 100644 --- a/src/2022/day16/aoc.cpp +++ b/src/2022/day16/aoc.cpp @@ -54,46 +54,46 @@ void rank_neighbours(valve* v, std::map<valve*, int>& visited) { } } -void update_total(int* total, std::set<valve*>& opened) { - for (valve* v : opened) { - *total += v->rate; +void update_total(int* total, std::map<valve*, int>& opened, int m) { + int t{0}; + for (auto& kv : opened) { + t += kv.first->rate * (kv.second - m); } + *total = t; } // m minutes left at v -void flow(int m, valve* v, std::map<valve_m, int>& visited, std::set<valve*> opened, int os, int total, int* max) { - update_total(&total, opened); +void flow(int m, valve* v, std::map<valve*, int> opened, int os, int total, int* max) { + update_total(&total, opened, m); if (m == 0) { if (*max < total) { *max = total; } } else { - auto p = visited.insert({{v, m}, total}); - if (!p.second) { - if (total <= p.first->second) { - return; - } else { - p.first->second = total; - } - } - std::cout << "at " << v->name << " when " << m << " minutes left, total is " << total << std::endl; + // std::cout << "at " << v->name << " when " << m << " minutes left, total is " << total << std::endl; if (os >= maxopened) { - flow(m - 1, v, visited, opened, os, total, max); + flow(m - 1, v, opened, os, total, max); } else { if (opened.find(v) == opened.end()) { if (v->rate > 0) { os += 1; m -= 1; } - opened.insert(v); + opened.insert({v, m}); } - - // choose next - for (auto& n : diagram[v]) { - if (m >= n.m) { - auto v = visited; - flow(m - n.m, n.v, visited, opened, os, total, max); - visited = v; + if (os >= maxopened) { + flow(m - 1, v, opened, os, total, max); + } else { + // choose next + auto f{false}; + for (auto& n : diagram[v]) { + if (m >= n.m && opened.find(n.v) == opened.end()) { + f = true; + flow(m - n.m, n.v, opened, os, total, max); + } + } + if (!f && m > 0) { + flow(m - 1, v, opened, os, total, max); } } } @@ -117,30 +117,29 @@ std::pair<int, int> day16(line_view file) { rank_neighbours(v, visited); std::vector<valve_m> vs; for (auto& kv : visited) { - if (kv.first != v) { + if (kv.first != v && kv.first->rate > 0) { vs.emplace_back(valve_m{kv.first, kv.second}); } } - std::sort(vs.begin(), vs.end(), [](valve_m v1, valve_m v2) { return v1.m < v2.m; }); + std::sort(vs.begin(), vs.end(), [](valve_m v1, valve_m v2) { + return v1.m < v2.m ? true : v1.m > v2.m ? false : v1.v->rate > v2.v->rate; + }); diagram.insert({v, vs}); } - for (auto& kv : diagram) { - std::cout << kv.first->name << ": "; - for (auto& m : kv.second) { - std::cout << m.v->name << "(" << m.m << ") "; - } - std::cout << std::endl; - } - - int max{INT32_MIN}; - std::set<valve*> opened; - std::map<valve_m, int> visited; - flow(30, get("AA"), visited, opened, 0, 0, &max); + // for (auto& kv : diagram) { + // std::cout << kv.first->name << ": "; + // for (auto& m : kv.second) { + // std::cout << m.v->name << "(" << m.m << "," << m.v->rate << ") "; + // } + // std::cout << std::endl; + // } - printf("%d\n", max); + int m1{INT32_MIN}; + std::map<valve*, int> opened; + flow(30, get("AA"), opened, 0, 0, &m1); - return {0, 0}; + return {m1, 0}; } } // namespace aoc2022 |