From 0a0a4ec5d90c6d6928433c80fa61b89be655d1ab Mon Sep 17 00:00:00 2001 From: Joe Ardent <code@ardent.nebcorp.com> Date: Sun, 5 Jan 2025 22:47:09 -0800 Subject: [PATCH] Clean up graph searching code. --- day10/src/main.rs | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/day10/src/main.rs b/day10/src/main.rs index 8b4c687..c66502f 100644 --- a/day10/src/main.rs +++ b/day10/src/main.rs @@ -8,41 +8,28 @@ fn main() { } fn pt1(grid: &Grid) -> usize { - dfs(grid) + score(grid) } fn pt2(grid: &Grid) -> usize { - bfs(grid) + rank(grid) } -fn dfs(grid: &Grid) -> usize { +fn score(grid: &Grid) -> usize { let mut total = 0; for head in grid.heads.iter() { let mut htotal = 0; - let mut processed = HashSet::new(); let mut q = Vec::new(); - + let mut nines = HashSet::new(); q.push(*head); while let Some(current) = q.pop() { - if !processed.contains(¤t) { - q.push(current); + if grid.get(¤t).unwrap() == 9 && nines.insert(current) { + htotal += 1; } - - let mut do_top = true; let nexts = grid.next_step(¤t); for next in nexts.iter() { - if !processed.contains(next) { - q.push(*next); - do_top = false; - } - } - - if do_top { - let _ = q.pop(); - if processed.insert(current) && grid.get(¤t).unwrap() == 9 { - htotal += 1; - } + q.push(*next); } } total += htotal; @@ -51,7 +38,7 @@ fn dfs(grid: &Grid) -> usize { total } -fn bfs(grid: &Grid) -> usize { +fn rank(grid: &Grid) -> usize { let mut total = 0; for head in grid.heads.iter() { @@ -59,12 +46,11 @@ fn bfs(grid: &Grid) -> usize { let mut q = VecDeque::new(); q.push_back(*head); while let Some(current) = q.pop_front() { + if grid.get(¤t).unwrap() == 9 { + htotal += 1; + } let nexts = grid.next_step(¤t); for next in nexts.iter() { - if grid.get(next).unwrap() == 9 { - htotal += 1; - } - q.push_back(*next); } } @@ -157,6 +143,8 @@ impl Grid { out } + // returns list of neighbor nodes in a dag where the edges are all one step in + // distance fn next_step(&self, loc: &Loc) -> Vec<Loc> { let alt = self.rows[loc.row][loc.col]; let target = alt + 1;