Skip to content

Commit

Permalink
day 23: bugfix: fix dfs
Browse files Browse the repository at this point in the history
  • Loading branch information
livexia committed Dec 23, 2023
1 parent e66f685 commit b4b8a10
Showing 1 changed file with 50 additions and 14 deletions.
64 changes: 50 additions & 14 deletions aoc23/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,33 @@ fn parse_input<T: AsRef<str>>(input: T) -> Vec<Vec<char>> {
.collect()
}

fn dfs(pos: Coord, trails: &[Vec<char>], visited: &mut HashSet<Coord>) -> usize {
if pos.1 == trails.len() - 1 {
0
fn dfs(
pos: Coord,
trails: &[Vec<char>],
visited: &mut HashSet<Coord>,
part2: bool,
) -> Option<usize> {
if pos.0 == trails.len() - 1 {
if trails[pos.0][pos.1] == '.' {
Some(0)
} else {
None
}
} else {
let (x, y) = pos;
let possible = match trails[x][y] {
'.' => vec![(-1, 0), (1, 0), (0, -1), (0, 1)],
'>' => vec![(0, 1)],
'<' => vec![(0, -1)],
'^' => vec![(-1, 0)],
'v' => vec![(1, 0)],
_ => return 0,
let possible = if !part2 {
match trails[x][y] {
'.' => vec![(-1, 0), (1, 0), (0, -1), (0, 1)],
'>' => vec![(0, 1)],
'<' => vec![(0, -1)],
'^' => vec![(-1, 0)],
'v' => vec![(1, 0)],
_ => return None,
}
} else if trails[x][y] != '#' {
vec![(-1, 0), (1, 0), (0, -1), (0, 1)]
} else {
return None;
};
let mut count = 0;
for (dx, dy) in possible {
Expand All @@ -43,19 +58,25 @@ fn dfs(pos: Coord, trails: &[Vec<char>], visited: &mut HashSet<Coord>) -> usize
let nx = nx as usize;
let ny = ny as usize;
if trails[nx][ny] != '#' && visited.insert((nx, ny)) {
count = count.max(1 + dfs((nx, ny), trails, visited));
if let Some(remain) = dfs((nx, ny), trails, visited, part2) {
count = count.max(1 + remain);
}
visited.remove(&(nx, ny));
}
}
count
if count == 0 {
None
} else {
Some(count)
}
}
}

fn part1(trails: &[Vec<char>]) -> Result<usize> {
let _start = Instant::now();

let result = (0..trails[0].len())
.map(|y| dfs((0, y), trails, &mut HashSet::new()))
.filter_map(|y| dfs((0, y), trails, &mut HashSet::new(), false))
.max()
.unwrap();

Expand All @@ -64,13 +85,26 @@ fn part1(trails: &[Vec<char>]) -> Result<usize> {
Ok(result)
}

fn part2(trails: &[Vec<char>]) -> Result<usize> {
let _start = Instant::now();

let result = (0..trails[0].len())
.filter_map(|y| dfs((0, y), trails, &mut HashSet::new(), true))
.max()
.unwrap();

writeln!(io::stdout(), "Part 2: {result}")?;
writeln!(io::stdout(), "> Time elapsed is: {:?}", _start.elapsed())?;
Ok(result)
}

fn main() -> Result<()> {
let mut input = String::new();
io::stdin().read_to_string(&mut input)?;

let trails = parse_input(input);
part1(&trails)?;
// part2()?;
part2(&trails)?;
Ok(())
}

Expand Down Expand Up @@ -101,12 +135,14 @@ fn example_input() {
#####################.#";
let trails = parse_input(input);
assert_eq!(part1(&trails).unwrap(), 94);
assert_eq!(part2(&trails).unwrap(), 154);
}

#[test]
fn real_input() {
let input = std::fs::read_to_string("input/input.txt").unwrap();
let trails = parse_input(input);
assert_eq!(part1(&trails).unwrap(), 2394);
assert_eq!(part2(&trails).unwrap(), 2394);
assert_eq!(2, 2);
}

0 comments on commit b4b8a10

Please sign in to comment.