diff --git a/2018/day17/src/main.rs b/2018/day17/src/main.rs index 242356f..de461d5 100644 --- a/2018/day17/src/main.rs +++ b/2018/day17/src/main.rs @@ -166,6 +166,48 @@ fn pour_over(m: &mut Map, start_x: usize, start_y: usize) { } } +fn lock_water(m: &mut Map, bounds: &MapBounds) { + for y in bounds.min_y..=bounds.max_y { + for x in 0..MAP_SIZE { + if m[x][y] == FALLING_WATER { + let mut locked = true; + for k in (0..x).rev() { + if m[k][y] == WALL_SPACE { + break; + } else if m[k][y] == EMPTY_SPACE { + locked = false; + break; + } + } + for k in (x+1)..MAP_SIZE { + if m[k][y] == WALL_SPACE { + break; + } else if m[k][y] == EMPTY_SPACE { + locked = false; + break; + } + } + if locked { + m[x][y] = WATER; + } else { + for k in (0..x).rev() { + if m[k][y] == EMPTY_SPACE || m[k][y] == WALL_SPACE { + break; + } + m[k][y] = FALLING_WATER; + } + for k in (x+1)..MAP_SIZE { + if m[k][y] == EMPTY_SPACE || m[k][y] == WALL_SPACE { + break; + } + m[k][y] = FALLING_WATER; + } + } + } + } + } +} + fn count_water(m: &Map, bounds: &MapBounds) -> usize { let mut squares: usize = 0; for y in bounds.min_y..=bounds.max_y { @@ -198,9 +240,17 @@ fn count_resting_water(m: &Map, bounds: &MapBounds) -> usize { fn main() { let (mut m, bounds) = build_map_from_file("input"); pour_over(&mut m, 500, 0); - print_map(&m, 0, MAP_SIZE - 1, 0, MAP_SIZE - 1); + if cfg!(debug_assertions) { + print_map(&m, 0, MAP_SIZE - 1, 0, MAP_SIZE - 1); + } let water_squares = count_water(&m, &bounds); println!("found {} water squares", water_squares); + lock_water(&mut m, &bounds); + if cfg!(debug_assertions) { + print_map(&m, 0, MAP_SIZE - 1, 0, MAP_SIZE - 1); + } + let water_squares = count_water(&m, &bounds); + println!("found {} locked water squares", water_squares); let resting_squares = count_resting_water(&m, &bounds); println!("found {} resting water squares", resting_squares); }