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