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