Add solution for "Day 16: Reindeer Maze", part 1

This commit is contained in:
2025-04-30 19:40:36 +02:00
parent a819caba8b
commit 08a94ba068
11 changed files with 603 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
// Solutions to the Advent Of Code 2024.
// Copyright (C) 2025 Stefan Müller
//
// This program is free software: you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free Software
// Foundation, either version 3 of the License, or (at your option) any later
// version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with
// this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
#include <list>
#include <vector>
#include <aoc/LinesSolver.hpp>
#include <aoc/ReindeerMazeCrossing.hpp>
#include <aoc/ReindeerMazePathIncidence.hpp>
#include <aoc/WeightedEdgeGraph.hpp>
class ReindeerMaze
: public LinesSolver
{
public:
ReindeerMaze(const int inputFileNameSuffix = 0);
virtual const std::string getPuzzleName() const override;
virtual const int getPuzzleDay() const override;
virtual void finish() override;
private:
static constexpr char getStartChar();
static constexpr char getEndChar();
static constexpr char getWallChar();
static constexpr int getTurnCost();
void initializeWorkList(std::list<ReindeerMazeCrossing>& crossings, const int entryVertex);
void addCheckedIncidence(std::vector<ReindeerMazePathIncidence>& incidences, const Point2 start,
const Point2 direction);
Point2 findStart();
void AddPathSegmentEdges(WeightedEdgeGraph& graph, const ReindeerMazePathIncidence& pathIncidence,
const std::vector<ReindeerMazePathIncidence>& otherPathIncidences);
};

View File

@@ -0,0 +1,32 @@
// Solutions to the Advent Of Code 2024.
// Copyright (C) 2025 Stefan Müller
//
// This program is free software: you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free Software
// Foundation, either version 3 of the License, or (at your option) any later
// version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with
// this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
#include <vector>
#include <aoc/Point2.hpp>
#include <aoc/ReindeerMazePathIncidence.hpp>
class ReindeerMazeCrossing
{
public:
ReindeerMazeCrossing(const Point2 position);
Point2 getPosition() const;
bool isFinished() const;
std::vector<ReindeerMazePathIncidence> incidences;
private:
Point2 position_;
};

View File

@@ -0,0 +1,34 @@
// Solutions to the Advent Of Code 2024.
// Copyright (C) 2025 Stefan Müller
//
// This program is free software: you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free Software
// Foundation, either version 3 of the License, or (at your option) any later
// version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with
// this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
#include <aoc/Point2.hpp>
class ReindeerMazePathIncidence
{
public:
ReindeerMazePathIncidence(const Point2 direction);
ReindeerMazePathIncidence(const Point2 direction, const int pathVertex);
Point2 getDirection() const;
int getPathVertex() const;
void setPathVertex(const int pathVertex);
int getPathCost() const;
void setPathCost(const int pathCost);
private:
Point2 direction_;
int pathVertex_;
int pathCost_;
};

View File

@@ -0,0 +1,28 @@
// Solutions to the Advent Of Code 2024.
// Copyright (C) 2025 Stefan Müller
//
// This program is free software: you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free Software
// Foundation, either version 3 of the License, or (at your option) any later
// version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with
// this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
class VertexEdgeIncidence
{
public:
VertexEdgeIncidence(const int vertex, const int next)
{
this->vertex = vertex;
this->next = next;
}
int vertex;
int next;
};

View File

@@ -0,0 +1,33 @@
// Solutions to the Advent Of Code 2024.
// Copyright (C) 2025 Stefan Müller
//
// This program is free software: you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free Software
// Foundation, either version 3 of the License, or (at your option) any later
// version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with
// this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
#include <vector>
#include <aoc/VertexEdgeIncidence.hpp>
class WeightedEdgeGraph
{
public:
WeightedEdgeGraph();
int addVertex();
void addEdge(const int vertex1, const int vertex2, const int weight);
int dijkstra(const int source, const int target) const;
private:
std::vector<int> firstVertexIncidences_;
std::vector<VertexEdgeIncidence> vertexEdgeIncidences_;
std::vector<int> edgeWeights_;
};