|
@@ -123,8 +123,38 @@ pub fn part_one(input: &str) -> Option<usize> {
|
|
|
|
|
|
}
|
|
|
|
|
|
-pub fn part_two(input: &str) -> Option<u32> {
|
|
|
- None
|
|
|
+pub fn part_two(input: &str) -> Option<usize> {
|
|
|
+ let _map: Vec<Vec<char>> = input.lines().map(|line| line.chars().collect()).collect();
|
|
|
+ let mut end_coord = Point { x: 0, y: 0 };
|
|
|
+ let mut start_coord = Point { x: 0, y: 0 };
|
|
|
+ let mut to_visit: HashSet<Point> = HashSet::new();
|
|
|
+ let mut distances: HashMap<Point, usize> = HashMap::new();
|
|
|
+
|
|
|
+
|
|
|
+ for (r_idx, row) in _map.iter().enumerate() {
|
|
|
+ for (col_idx, c) in row.iter().enumerate() {
|
|
|
+ to_visit.insert(Point {x: col_idx, y: r_idx});
|
|
|
+ distances.insert(Point {x: col_idx, y: r_idx}, usize::MAX);
|
|
|
+ if *c == 'E' {
|
|
|
+ end_coord = Point {y: r_idx, x: col_idx};
|
|
|
+ } else if *c == 'S' {
|
|
|
+ start_coord = Point {y: r_idx, x: col_idx};
|
|
|
+ distances.insert(Point {x: col_idx, y: r_idx}, 0);
|
|
|
+ } else if *c == 'a' {
|
|
|
+ distances.insert(Point {x: col_idx, y: r_idx}, 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ let mut map = HeightMap {
|
|
|
+ best_steps: HashMap::new(),
|
|
|
+ map: _map,
|
|
|
+ start: start_coord.clone(),
|
|
|
+ end: end_coord.clone()
|
|
|
+ };
|
|
|
+ dijkstra(map, &mut to_visit, &mut distances, &end_coord);
|
|
|
+ return Some(distances[&end_coord]);
|
|
|
}
|
|
|
|
|
|
fn main() {
|
|
@@ -146,6 +176,6 @@ mod tests {
|
|
|
#[test]
|
|
|
fn test_part_two() {
|
|
|
let input = advent_of_code::read_file("examples", 12);
|
|
|
- assert_eq!(part_two(&input), None);
|
|
|
+ assert_eq!(part_two(&input), Some(29));
|
|
|
}
|
|
|
}
|