Solve day 18
This commit is contained in:
parent
f3c1072d08
commit
018514a9f9
3 changed files with 3533 additions and 0 deletions
25
input/18-0.in
Normal file
25
input/18-0.in
Normal 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
3450
input/18-1.in
Normal file
File diff suppressed because it is too large
Load diff
58
src/bin/18.rs
Normal file
58
src/bin/18.rs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue