Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
epidemian
GitHub Repository: epidemian/advent-of-code-2021
Path: blob/main/src/day15.rs
97 views
1
use crate::dijkstra;
2
3
pub fn run() {
4
let risk_map: Vec<Vec<usize>> = include_str!("inputs/day15")
5
.lines()
6
.map(|l| {
7
l.chars()
8
.map(|ch| ch.to_digit(10).unwrap() as usize)
9
.collect()
10
})
11
.collect();
12
13
println!("{}", shortest_path(&risk_map));
14
15
let full_risk_map = expand_map(&risk_map);
16
println!("{}", shortest_path(&full_risk_map));
17
}
18
19
fn expand_map(map: &Vec<Vec<usize>>) -> Vec<Vec<usize>> {
20
let size = map.len();
21
let full_size = size * 5;
22
let mut full_map: Vec<Vec<usize>> = vec![vec![0; full_size]; full_size];
23
for y in 0..full_size {
24
for x in 0..full_size {
25
let risk = map[y % size][x % size] + (x / size + y / size);
26
let wrapped_risk = (risk - 1) % 9 + 1;
27
full_map[y][x] = wrapped_risk;
28
}
29
}
30
full_map
31
}
32
33
fn shortest_path(risk_map: &Vec<Vec<usize>>) -> usize {
34
let size = risk_map.len();
35
let start = (0, 0);
36
let end = (size - 1, size - 1);
37
38
let neighbors = |&(x, y): &(usize, usize)| {
39
[(1, 0), (-1, 0), (0, 1), (0, -1)]
40
.iter()
41
.map(move |(dx, dy)| (x as i32 + dx, y as i32 + dy))
42
.filter(|&(x, y)| 0 <= x && x < size as i32 && 0 <= y && y < size as i32)
43
.map(|(x, y)| ((x as usize, y as usize), risk_map[y as usize][x as usize]))
44
};
45
46
dijkstra::shortest_path(&start, &end, neighbors).unwrap()
47
}
48
49