Moved day 16 graph construction into own method
This commit is contained in:
		
							parent
							
								
									4302a7b2f7
								
							
						
					
					
						commit
						7f0b70c8ef
					
				@ -36,6 +36,7 @@ class ReindeerMaze
 | 
			
		||||
    static constexpr char getEndChar();
 | 
			
		||||
    static constexpr char getWallChar();
 | 
			
		||||
    static constexpr int getTurnCost();
 | 
			
		||||
    void buildPathSegmentGraph(WeightedEdgeGraph& graph, const int entry, const int exit);
 | 
			
		||||
    void initializeWorkList(std::list<ReindeerMazeCrossing>& crossings, const int entryVertex);
 | 
			
		||||
    void addCheckedIncidence(std::vector<ReindeerMazePathIncidence>& incidences, const Point2 start,
 | 
			
		||||
        const Point2 direction);
 | 
			
		||||
 | 
			
		||||
@ -32,11 +32,38 @@ const int ReindeerMaze::getPuzzleDay() const
 | 
			
		||||
 | 
			
		||||
void ReindeerMaze::finish()
 | 
			
		||||
{
 | 
			
		||||
    // Initializes the graph of path segment incidences.
 | 
			
		||||
    WeightedEdgeGraph graph{};
 | 
			
		||||
    auto entry = graph.addVertex();
 | 
			
		||||
    auto exit = graph.addVertex();
 | 
			
		||||
    buildPathSegmentGraph(graph, entry, exit);
 | 
			
		||||
 | 
			
		||||
    part1 = graph.dijkstra(entry, exit) / 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
constexpr char ReindeerMaze::getStartChar()
 | 
			
		||||
{
 | 
			
		||||
    return 'S';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
constexpr char ReindeerMaze::getEndChar()
 | 
			
		||||
{
 | 
			
		||||
    return 'E';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
constexpr char ReindeerMaze::getWallChar()
 | 
			
		||||
{
 | 
			
		||||
    return '#';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
constexpr int ReindeerMaze::getTurnCost()
 | 
			
		||||
{
 | 
			
		||||
    return 1000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Constructs the graph of path segment incidences, starting with a graph that already contains the entry and the exit
 | 
			
		||||
// vertices.
 | 
			
		||||
void ReindeerMaze::buildPathSegmentGraph(WeightedEdgeGraph& graph, const int entry, const int exit)
 | 
			
		||||
{
 | 
			
		||||
    // Uses list for work items to prevent invalidation of iterators on add.
 | 
			
		||||
    std::list<ReindeerMazeCrossing> crossings{};
 | 
			
		||||
    initializeWorkList(crossings, entry);
 | 
			
		||||
@ -56,8 +83,8 @@ void ReindeerMaze::finish()
 | 
			
		||||
 | 
			
		||||
        int nNext{ 0 };
 | 
			
		||||
        while (getCharAt(position) != getEndChar() &&
 | 
			
		||||
            std::find_if(crossings.begin(), crossings.end(),
 | 
			
		||||
                [position](auto& x) { return x.getPosition() == position; }) == crossings.end())
 | 
			
		||||
               std::find_if(crossings.begin(), crossings.end(),
 | 
			
		||||
                   [position](auto& x) { return x.getPosition() == position; }) == crossings.end())
 | 
			
		||||
        {
 | 
			
		||||
            nNext = 0;
 | 
			
		||||
            Point2 nextPosition, nextDirection;
 | 
			
		||||
@ -143,10 +170,9 @@ void ReindeerMaze::finish()
 | 
			
		||||
            // Determines the end crossing of the new path segment and its incidence.
 | 
			
		||||
            std::list<ReindeerMazeCrossing>::iterator endCrossing;
 | 
			
		||||
            std::vector<ReindeerMazePathIncidence>::iterator endIncidence;
 | 
			
		||||
            endCrossing = nNext == 1
 | 
			
		||||
                ? endCrossing = std::find_if(crossings.begin(), crossings.end(),
 | 
			
		||||
                    [position](auto& x) { return x.getPosition() == position; })
 | 
			
		||||
                : --crossings.end();
 | 
			
		||||
            endCrossing = nNext == 1 ? endCrossing = std::find_if(crossings.begin(), crossings.end(),
 | 
			
		||||
                                           [position](auto& x) { return x.getPosition() == position; })
 | 
			
		||||
                                     : --crossings.end();
 | 
			
		||||
            if (endCrossing != crossings.end())
 | 
			
		||||
            {
 | 
			
		||||
                // This incidence must exist, no need to check the incidence iterator.
 | 
			
		||||
@ -168,7 +194,7 @@ void ReindeerMaze::finish()
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Checks if end crossing is finished.
 | 
			
		||||
            //checkFinishedCrossing(crossings, endCrossing);
 | 
			
		||||
            // checkFinishedCrossing(crossings, endCrossing);
 | 
			
		||||
            if (endCrossing != crossings.end() && endCrossing->isFinished())
 | 
			
		||||
            {
 | 
			
		||||
                crossings.erase(endCrossing);
 | 
			
		||||
@ -181,28 +207,6 @@ void ReindeerMaze::finish()
 | 
			
		||||
            crossings.erase(startCrossing);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    part1 = graph.dijkstra(entry, exit) / 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
constexpr char ReindeerMaze::getStartChar()
 | 
			
		||||
{
 | 
			
		||||
    return 'S';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
constexpr char ReindeerMaze::getEndChar()
 | 
			
		||||
{
 | 
			
		||||
    return 'E';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
constexpr char ReindeerMaze::getWallChar()
 | 
			
		||||
{
 | 
			
		||||
    return '#';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
constexpr int ReindeerMaze::getTurnCost()
 | 
			
		||||
{
 | 
			
		||||
    return 1000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Initializes the work list of crossing incidences.
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user