From cd44eda36e74eb0a0d92125a2df58a76764e031a Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Wed, 18 Dec 2024 16:40:30 +0100 Subject: aoc 2024, day 18, part 1 --- 2024/src/day18.cpp | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 2024/src/day18.cpp (limited to '2024/src') diff --git a/2024/src/day18.cpp b/2024/src/day18.cpp new file mode 100644 index 0000000..fedd836 --- /dev/null +++ b/2024/src/day18.cpp @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; + +using pos_type = tuple; + +vector +read_file(string_view filename) +{ + fstream input{ filename }; + vector data; + + long lhs = 0; + long rhs = 0; + char chr = 0; + + while ( input >> lhs >> chr >> rhs ) { + data.emplace_back(lhs, rhs); + } + return data; +} + +void +part1(const vector& data, long size) +{ + set stones{ data.begin(), data.end() }; + + set seen; + + // x, y, distance + queue> queue; + queue.push({ { 0, 0 }, 0 }); + + while ( !queue.empty() ) { + const auto& [pos, distance] = queue.front(); + queue.pop(); + + const auto [x, y] = pos; + + if ( x == size && y == size ) { + cout << distance << endl; + return; + } + + if ( x < 0 || y < 0 || x > size || y > size ) { + continue; + } + + if ( stones.contains(pos) ) { + continue; + } + + if ( seen.contains(pos) ) { + continue; + } + seen.insert(pos); + + for ( const auto& [nx, ny]: vector{ { x - 1, y }, { x + 1, y }, { x, y - 1 }, { x, y + 1 } } ) { + queue.push({ { nx, ny }, distance + 1 }); + } + } +} + +int +main() +{ + const auto data = read_file("data/day18.txt"); + part1({ data.begin(), data.begin() + 1024 }, 70); +} -- cgit v1.3