From 78af1f8bac1f8a81423d3a8a9d267d8bc98c0dde Mon Sep 17 00:00:00 2001 From: Maciej Jur Date: Mon, 12 Dec 2022 16:53:46 +0100 Subject: [PATCH] 2022 rust day 12 --- 2022/rust/src/solutions/day12.rs | 42 +++++++++++++++++++------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/2022/rust/src/solutions/day12.rs b/2022/rust/src/solutions/day12.rs index c964613..b823a2d 100644 --- a/2022/rust/src/solutions/day12.rs +++ b/2022/rust/src/solutions/day12.rs @@ -47,19 +47,8 @@ fn manhattan(start: (usize, usize), goal: (usize, usize)) -> i32 { (start.0.abs_diff(goal.0) + start.1.abs_diff(goal.1)) as i32 } -fn unwind_path( - parent_map: &HashMap<(usize, usize), (usize, usize)>, - start: (usize, usize), - goal: (usize, usize), -) -> Option> { - let mut path = vec![goal]; - while !path.last()?.eq(&start) { - path.push(*parent_map.get(path.last()?)?); - } - Some(path) -} -fn a_star(start: (usize, usize), goal: (usize, usize), grid: &Matrix) -> Vec<(usize, usize)> { +fn a_star(start: (usize, usize), goal: (usize, usize), grid: &Matrix) -> Option> { let mut frontier: BinaryHeap = BinaryHeap::new(); let mut parent: HashMap<(usize, usize), (usize, usize)> = HashMap::new(); let mut cost: HashMap<(usize, usize), i32> = HashMap::from([(start, 0)]); @@ -85,15 +74,34 @@ fn a_star(start: (usize, usize), goal: (usize, usize), grid: &Matrix) -> Vec } } - unwind_path(&parent, start, goal).unwrap() + let mut path = vec![goal]; + while !path.last()?.eq(&start) { + path.push(*parent.get(path.last()?)?); + } + Some(path) } fn solve1((start, goal, grid): &Data) -> usize { - a_star(*start, *goal, grid).len() - 1 + a_star(*start, *goal, grid).unwrap().len() - 1 } -fn solve2(data: &Data) -> i32 { - 2 +fn find_low_points(grid: &Matrix) -> Vec<(usize, usize)> { + grid.cell_indices() + .filter_map(|index| match grid[index] == 0 { + true => Some(index), + false => None + }) + .collect() +} + +fn solve2((_, goal, grid): &Data) -> usize { + find_low_points(grid) + .into_iter() + .filter_map(|start| + a_star(start, *goal, grid).map(|path| path.len() - 1) + ) + .min() + .unwrap() } @@ -138,6 +146,6 @@ mod tests { #[test] fn part2() { - assert_eq!(2, solve2(&parse_data(DATA))); + assert_eq!(29, solve2(&parse_data(DATA))); } }