1
0
Fork 0

part 2 solution

main
Andrew Coleman 2019-01-19 17:24:46 -05:00
parent dfcdf0f83d
commit 960a2b1e28
1 changed files with 51 additions and 1 deletions

View File

@ -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 { fn count_water(m: &Map, bounds: &MapBounds) -> usize {
let mut squares: usize = 0; let mut squares: usize = 0;
for y in bounds.min_y..=bounds.max_y { for y in bounds.min_y..=bounds.max_y {
@ -198,9 +240,17 @@ fn count_resting_water(m: &Map, bounds: &MapBounds) -> usize {
fn main() { fn main() {
let (mut m, bounds) = build_map_from_file("input"); let (mut m, bounds) = build_map_from_file("input");
pour_over(&mut m, 500, 0); 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); let water_squares = count_water(&m, &bounds);
println!("found {} water squares", water_squares); 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); let resting_squares = count_resting_water(&m, &bounds);
println!("found {} resting water squares", resting_squares); println!("found {} resting water squares", resting_squares);
} }