diff options
Diffstat (limited to '2022/08/b.rs')
| -rw-r--r-- | 2022/08/b.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/2022/08/b.rs b/2022/08/b.rs new file mode 100644 index 0000000..5f7bce8 --- /dev/null +++ b/2022/08/b.rs | |||
| @@ -0,0 +1,47 @@ | |||
| 1 | use std::cmp::max; | ||
| 2 | mod common; | ||
| 3 | use common::*; | ||
| 4 | |||
| 5 | fn count_visible_from(grid: &Grid, i0: usize, j0: usize) -> usize { | ||
| 6 | let x = grid[i0][j0].0; | ||
| 7 | let mut top = 0; | ||
| 8 | for i in (0..i0).rev() { | ||
| 9 | top += 1; | ||
| 10 | if grid[i][j0].0 >= x { break; } | ||
| 11 | } | ||
| 12 | |||
| 13 | let mut bottom = 0; | ||
| 14 | for i in i0+1..grid.len() { | ||
| 15 | bottom += 1; | ||
| 16 | if grid[i][j0].0 >= x { break; } | ||
| 17 | } | ||
| 18 | |||
| 19 | let mut left = 0; | ||
| 20 | for j in (0..j0).rev() { | ||
| 21 | left += 1; | ||
| 22 | if grid[i0][j].0 >= x { break; } | ||
| 23 | } | ||
| 24 | |||
| 25 | let mut right = 0; | ||
| 26 | for j in j0+1..grid[0].len() { | ||
| 27 | right += 1; | ||
| 28 | if grid[i0][j].0 >= x { break; } | ||
| 29 | } | ||
| 30 | |||
| 31 | top * bottom * left * right | ||
| 32 | } | ||
| 33 | |||
| 34 | fn max_view_factor(grid: &Grid) -> usize { | ||
| 35 | let mut m = 0; | ||
| 36 | for i in 0..grid.len() { | ||
| 37 | for j in 0..grid[0].len() { | ||
| 38 | m = max(m, count_visible_from(grid, i, j)); | ||
| 39 | } | ||
| 40 | } | ||
| 41 | m | ||
| 42 | } | ||
| 43 | |||
| 44 | fn main() { | ||
| 45 | let grid = read_grid_from_stdin(); | ||
| 46 | println!("{}", max_view_factor(&grid)); | ||
| 47 | } | ||
