Solve day 18

This commit is contained in:
hal8174 2024-12-18 22:37:49 +01:00
parent f3c1072d08
commit 018514a9f9
3 changed files with 3533 additions and 0 deletions

25
input/18-0.in Normal file
View file

@ -0,0 +1,25 @@
5,4
4,2
4,5
3,0
2,1
6,3
2,4
1,5
0,6
3,3
2,6
5,1
1,2
5,5
2,5
6,5
1,4
0,4
6,4
1,1
6,1
1,0
0,5
1,6
2,0

3450
input/18-1.in Normal file

File diff suppressed because it is too large Load diff

58
src/bin/18.rs Normal file
View file

@ -0,0 +1,58 @@
use std::collections::{HashMap, HashSet, VecDeque};
static DIRECTIONS: [(isize, isize); 4] = [(0, -1), (1, 0), (0, 1), (-1, 0)];
fn dijkstra(map: &HashSet<(usize, usize)>, size: usize) -> Option<usize> {
let mut queue = VecDeque::new();
queue.push_back((0usize, 0usize, 0usize));
let mut visited = HashSet::new();
while let Some((cx, cy, steps)) = queue.pop_front() {
if cx == size - 1 && cy == size - 1 {
return Some(steps);
}
if visited.insert((cx, cy)) {
for (nx, ny) in DIRECTIONS.iter().filter_map(|&(dx, dy)| {
Option::zip(
cx.checked_add_signed(dx).filter(|&s| s < size),
cy.checked_add_signed(dy).filter(|&s| s < size),
)
}) {
if !visited.contains(&(nx, ny)) && map.get(&(nx, ny)).is_none() {
queue.push_back((nx, ny, steps + 1));
}
}
}
}
None
}
fn main() {
// let text = std::fs::read_to_string("input/18-0.in").unwrap();
// let size = 7;
// let first = 12;
let text = std::fs::read_to_string("input/18-1.in").unwrap();
let size = 71;
let first = 1024;
let mut iter = text.lines().map(|l| {
let (x, y) = l.split_once(',').unwrap();
(x.parse::<usize>().unwrap(), y.parse::<usize>().unwrap())
});
let mut map = iter.by_ref().take(first).collect::<HashSet<_>>();
let t = dijkstra(&map, size);
println!("{t:?}");
for d in iter {
map.insert(d);
if dijkstra(&map, size).is_none() {
println!("{d:?}");
break;
}
}
}