Day 24, part 2

This commit is contained in:
jazzpi 2022-12-24 18:45:53 +01:00
parent a7d32abb93
commit 745d4a8029
3 changed files with 40 additions and 10 deletions

View File

@ -8,6 +8,6 @@ pub fn main() {
day24::print_map(&map, &start);
let rounds = day24::find_path(&map, &start, &target);
let (rounds, _) = day24::find_path(&map, &start, &target);
println!("Goal is reachable in {} min", rounds);
}

19
src/bin/d24p2.rs Normal file
View File

@ -0,0 +1,19 @@
use aoc22::{
day24::{self},
util,
};
pub fn main() {
let (map, start, target) = day24::parse_map(&util::parse_input());
day24::print_map(&map, &start);
let (rounds_1, map_1) = day24::find_path(&map, &start, &target);
println!("Goal is reachable in {} min", rounds_1);
let (rounds_2, map_2) = day24::find_path(&map_1, &target, &start);
println!("Start is reachable in {} min", rounds_2);
let (rounds_3, _) = day24::find_path(&map_2, &start, &target);
println!("Goal is reachable in {} min", rounds_2);
println!("Total time taken is {} min", rounds_1 + rounds_2 + rounds_3);
}

View File

@ -139,7 +139,15 @@ pub fn next_map(map: &Vec<Vec<Tile>>) -> Vec<Vec<Tile>> {
}
/// Returns length of the shortest path
pub fn find_path(initial: &Vec<Vec<Tile>>, start: &Coord, target: &Coord) -> usize {
pub fn find_path(
initial: &Vec<Vec<Tile>>,
start: &Coord,
target: &Coord,
) -> (usize, Vec<Vec<Tile>>) {
let height = initial.len();
assert!(height > 0);
let width = initial[0].len();
let mut map = initial.clone();
let mut to_check = HashSet::new();
to_check.insert(*start);
@ -151,20 +159,23 @@ pub fn find_path(initial: &Vec<Vec<Tile>>, start: &Coord, target: &Coord) -> usi
let mut check_next = HashSet::new();
for pos in to_check {
let mut reachable = vec![
pos,
(pos.0 + 1, pos.1),
(pos.0, pos.1 + 1),
(pos.0, pos.1 - 1),
];
// This would underflow in the first round
let mut reachable = vec![pos];
if pos.0 != 0 {
reachable.push((pos.0 - 1, pos.1));
}
if pos.0 != height - 1 {
reachable.push((pos.0 + 1, pos.1));
}
if pos.1 != 0 {
reachable.push((pos.0, pos.1 - 1));
}
if pos.1 != width - 1 {
reachable.push((pos.0, pos.1 + 1));
}
for p in reachable {
if p == *target {
return rounds;
return (rounds, map);
}
if matches!(map[p.0][p.1], Tile::Empty) {
check_next.insert(p);