blob: b145486dc95825807c3c98a20352247564e95819 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
use std::cmp::max;
mod common;
use common::*;
fn mark_visible(grid: &mut Grid) {
let update = |elem: &mut (i8, bool), m: &mut i8| {
elem.1 = elem.1 || elem.0 > *m;
*m = max(*m, elem.0);
};
for row in &mut *grid {
// From left
let mut m = -1;
for t in &mut *row { update(t, &mut m); }
// From right
let mut m = -1;
for t in &mut row.iter_mut().rev() { update(t, &mut m); }
}
for j in 0..grid[0].len() {
// From top
let mut m = -1;
for i in 0..grid.len() { update(&mut grid[i][j], &mut m); }
// From bottom
let mut m = -1;
for i in (0..grid.len()).rev() { update(&mut grid[i][j], &mut m); }
}
}
fn count_visible(grid: &Grid) -> usize {
grid.iter()
.map(|row| row.iter().filter(|c| c.1).count())
.sum()
}
fn main() {
let mut grid = read_grid_from_stdin();
mark_visible(&mut grid);
println!("{}", count_visible(&grid));
}
|