forked from haoel/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
IslandPerimeter.cpp
56 lines (52 loc) · 1.88 KB
/
IslandPerimeter.cpp
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// Source : https://leetcode.com/problems/island-perimeter/
// Author : Hao Chen
// Date : 2019-02-04
/*****************************************************************************************************
*
* You are given a map in form of a two-dimensional integer grid where 1 represents land and 0
* represents water.
*
* Grid cells are connected horizontally/vertically (not diagonally). The grid is completely
* surrounded by water, and there is exactly one island (i.e., one or more connected land cells).
*
* The island doesn't have "lakes" (water inside that isn't connected to the water around the island).
* One cell is a square with side length 1. The grid is rectangular, width and height don't exceed
* 100. Determine the perimeter of the island.
*
* Example:
*
* Input:
* [[0,1,0,0],
* [1,1,1,0],
* [0,1,0,0],
* [1,1,0,0]]
*
* Output: 16
*
* Explanation: The perimeter is the 16 yellow stripes in the image below:
*
******************************************************************************************************/
class Solution {
public:
int edge(vector<vector<int>> &grid, int x, int y) {
int edge = 0;
if (x==0 || (x>0 && grid[x-1][y] == 0 ) ) edge++; //up
if (y==0 || (y>0 && grid[x][y-1] == 0 ) ) edge++; //left
if (x == grid.size() - 1 ||
(x < grid.size() - 1 && grid[x+1][y] == 0)) edge++; //down
if (y == grid[0].size() - 1 ||
(y < grid[0].size() - 1 && grid[x][y+1] == 0)) edge++; //right
return edge;
}
int islandPerimeter(vector<vector<int>>& grid) {
int perimeter = 0;
for(int i=0; i<grid.size(); i++) {
for(int j=0; j<grid[0].size(); j++) {
if (grid[i][j] == 1) {
perimeter += edge (grid, i, j);
}
}
}
return perimeter;
}
};