Add Lines::findChar() to search for starting points in mazes

This commit is contained in:
Stefan Müller 2025-06-03 19:21:08 +02:00
parent 2afa527a85
commit 21e154ed34
8 changed files with 25 additions and 29 deletions

View File

@ -28,7 +28,6 @@ class GuardGallivant
public:
virtual const std::string getPuzzleName() const override;
virtual const int getPuzzleDay() const override;
virtual void processDataLine(const std::string& line) override;
virtual void finish() override;
private:
typedef Grid<bool> VisitGrid;

View File

@ -44,7 +44,6 @@ class ReindeerMaze
void initializeWorkList(std::list<ReindeerMazeCrossing>& crossings, const int entryVertex);
void addCheckedIncidence(std::vector<ReindeerMazePathIncidence>& incidences, const Point2 start,
const Point2 direction);
Point2 findStart() const;
void addPathSegmentEdges(WeightedEdgeGraph& graph, const ReindeerMazePathIncidence& pathIncidence,
const std::vector<ReindeerMazePathIncidence>& otherPathIncidences);
std::pair<int, int> makePositionsIdPair(const Point2& position1, const Point2& position2);

View File

@ -32,6 +32,7 @@ class Lines
bool isInBounds(const Point2& point) const;
char getCharAt(const Point2& point) const;
void setCharAt(const Point2& point, const char value);
Point2 findChar(const char c) const;
};
std::ostream& operator<<(std::ostream& os, const Lines& lines);

View File

@ -46,3 +46,9 @@ void LinesSolver<T1, T2>::setCharAt(const Point2& point, const char value)
{
lines.setCharAt(point, value);
}
template <typename T1, typename T2>
Point2 LinesSolver<T1, T2>::findChar(const char c) const
{
return lines.findChar(c);
}

View File

@ -33,4 +33,5 @@ class LinesSolver
bool isInBounds(const Point2& point) const;
char getCharAt(const Point2& point) const;
void setCharAt(const Point2& point, const char value);
Point2 findChar(const char c) const;
};

View File

@ -25,19 +25,9 @@ const int GuardGallivant::getPuzzleDay() const
return 6;
}
void GuardGallivant::processDataLine(const std::string& line)
{
auto pos = line.find(getStartChar());
if (pos != std::string::npos)
{
start_ = Point2{ static_cast<int>(pos), static_cast<int>(lines.size()) };
}
LinesSolver::processDataLine(line);
}
void GuardGallivant::finish()
{
start_ = findChar(getStartChar());
tracePath();
}

View File

@ -227,7 +227,7 @@ void ReindeerMaze::buildPathSegmentGraph(WeightedEdgeGraph& graph, VertexAttache
// Initializes the work list of crossing incidences.
void ReindeerMaze::initializeWorkList(std::list<ReindeerMazeCrossing>& crossings, const int entryVertex)
{
Point2 start{ findStart() };
Point2 start{ findChar(getStartChar()) };
crossings.emplace_back(start);
crossings.back().incidences.emplace_back(Point2::left, entryVertex);
addCheckedIncidence(crossings.back().incidences, start, Point2::right);
@ -243,21 +243,6 @@ void ReindeerMaze::addCheckedIncidence(std::vector<ReindeerMazePathIncidence>& i
}
}
Point2 ReindeerMaze::findStart() const
{
for (int j = 0; j < lines.size(); j++)
{
for (int i = 0; i < lines[j].size(); i++)
{
if (lines[j][i] == getStartChar())
{
return { i, j };
}
}
}
return { 0, 0 };
}
void ReindeerMaze::addPathSegmentEdges(WeightedEdgeGraph& graph, const ReindeerMazePathIncidence& pathIncidence,
const std::vector<ReindeerMazePathIncidence>& otherPathIncidences)
{

View File

@ -33,6 +33,21 @@ void Lines::setCharAt(const Point2& point, const char value)
at(point.y)[point.x] = value;
}
Point2 Lines::findChar(const char c) const
{
for (int j = 0; j < size(); j++)
{
for (int i = 0; i < at(j).size(); i++)
{
if (at(j)[i] == c)
{
return { i, j };
}
}
}
return { -1, -1 };
}
std::ostream& operator<<(std::ostream& os, const Lines& lines)
{
for (const auto& line : lines)