mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Implement starting point for day 10.
This commit is contained in:
@@ -1,10 +1,119 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <unordered_set>
|
||||
#include <queue>
|
||||
#include "days.hpp"
|
||||
#include "point.hpp"
|
||||
|
||||
namespace {
|
||||
typedef aoc2019::Point<int, 2> point_t;
|
||||
typedef std::vector<std::string> map_t;
|
||||
|
||||
std::array<point_t, 4> DIRECTIONS = {{
|
||||
{0, -1},
|
||||
{0, 1},
|
||||
{-1, 0},
|
||||
{1, 0},
|
||||
}};
|
||||
|
||||
std::vector<std::string> read_map(std::istream &input) {
|
||||
std::string buffer;
|
||||
std::vector<std::string> map;
|
||||
|
||||
while (std::getline(input, buffer)) {
|
||||
map.push_back(buffer);
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
std::pair<std::unordered_map<std::string, point_t>, std::unordered_map<std::string, std::pair<point_t, point_t>>>
|
||||
get_portals(const map_t &map) {
|
||||
std::unordered_map<std::string, point_t> half_portals;
|
||||
std::unordered_map<std::string, std::pair<point_t, point_t>> portals;
|
||||
|
||||
// First find horizontal portals
|
||||
for (int y = 0; y < map.size(); ++y) {
|
||||
for (int x = 0; x < map[y].size() - 1; ++x) {
|
||||
if (std::isalpha(map[y][x]) && std::isalpha(map[y][x + 1])) {
|
||||
// find out the entry point
|
||||
point_t entry_point = {0, y};
|
||||
if (x > 0 && map[y][x - 1] == '.') {
|
||||
entry_point[0] = x;
|
||||
} else {
|
||||
entry_point[0] = x + 1;
|
||||
}
|
||||
|
||||
auto name = map[y].substr(x, 2);
|
||||
|
||||
if (auto it = half_portals.find(name); it != half_portals.end()) {
|
||||
portals[name] = {entry_point, it->second};
|
||||
} else {
|
||||
half_portals[name] = entry_point;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
char name[3] = {0, 0, 0};
|
||||
for (int x = 0; x < map[0].size(); ++x) {
|
||||
for (int y = 0; y < map.size() - 1; ++y) {
|
||||
if (std::isalpha(map[y][x]) && std::isalpha(map[y + 1][x])) {
|
||||
name[0] = map[y][x];
|
||||
name[1] = map[y + 1][x];
|
||||
|
||||
point_t entry_point = {x, 0};
|
||||
if (y > 0 && map[y - 1][x] == '.') {
|
||||
entry_point[1] = y;
|
||||
} else {
|
||||
entry_point[1] = y + 1;
|
||||
}
|
||||
|
||||
if (auto it = half_portals.find(name); it != half_portals.end()) {
|
||||
portals[name] = {entry_point, it->second};
|
||||
} else {
|
||||
half_portals[name] = entry_point;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return std::make_pair(half_portals, portals);
|
||||
}
|
||||
}
|
||||
|
||||
void aoc2019::day20_part1(std::istream &input, std::ostream &output) {
|
||||
output << "Not implemented\n";
|
||||
const auto map = read_map(input);
|
||||
auto[half_portals, portals] = get_portals(map);
|
||||
|
||||
const auto starting_point = half_portals.at("AA");
|
||||
const auto goal = half_portals.at("ZZ");
|
||||
|
||||
std::unordered_map<point_t, point_t> links;
|
||||
for (auto &link : portals) {
|
||||
links[link.second.first] = link.second.second;
|
||||
links[link.second.second] = link.second.first;
|
||||
}
|
||||
|
||||
std::unordered_set<point_t> visited{starting_point};
|
||||
std::queue<std::pair<int, point_t>> todo;
|
||||
todo.emplace(0, starting_point);
|
||||
|
||||
while (!todo.empty()) {
|
||||
const auto[dist, pos] = todo.front();
|
||||
todo.pop();
|
||||
|
||||
if (pos == goal) {
|
||||
output << dist << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
output << "Not implemented\n";
|
||||
}
|
||||
|
||||
void aoc2019::day20_part2(std::istream &input, std::ostream &output) {
|
||||
output << "Not implemented\n";
|
||||
output << "Not implemented\n";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user