-
Notifications
You must be signed in to change notification settings - Fork 2
/
0463-island-perimeter.rs
37 lines (35 loc) · 1.08 KB
/
0463-island-perimeter.rs
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
struct Solution;
impl Solution {
pub fn island_perimeter(grid: Vec<Vec<i32>>) -> i32 {
let mut islands = 0;
let mut neighbors = 0;
let (rr, cc) = (grid.len(), grid[0].len());
for r in 0..rr {
for c in 0..cc {
if grid[r][c] == 1 {
islands += 1;
if r < rr - 1 && grid[r + 1][c] == 1 {
neighbors += 1; // down neighbors
}
if c < cc - 1 && grid[r][c + 1] == 1 {
neighbors += 1; // right neighbors
}
}
}
}
// Each adjacent island makes 2 sides disappear:
// +--+ +--+ +--+--+
// | | + | | -> | |
// +--+ +--+ +--+--+
islands * 4 - neighbors * 2
}
}
fn main() {
let grid = vec![
vec![0, 1, 0, 0],
vec![1, 1, 1, 0],
vec![0, 1, 0, 0],
vec![1, 1, 0, 0],
];
assert_eq!(16, Solution::island_perimeter(grid));
}