题目的要求是:给定一个二维数组,由0跟1组成,0代表水,1代表陆地,所有的1组成一个小岛,让我们计算小岛的周长。例子如下:
Example:
[[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]] Answer: 16 Explanation: The perimeter is the 16 yellow stripes in the image below:
我们有一个最基本的想法,如果忽略每个1拼接的边长,小岛的周长是4*(1的个数);所以,我们需要遍历数组,确定1的个数。同时,我们注意到,因为每个元素1可能有邻居,所以我们需要考虑拼接的情况,我们需要考虑每个1的右边邻居跟下方邻居,以此确定我们被拼接不计的边的个数。例如,当一个元素1右边有1个邻居时,意味着有2条边重叠拼接了,所以要在之前计算的周长上减2。所以,总的计算方法出来了。完整的代码如下:
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid) {
int island = 0, neighbor = 0;
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[0].size(); j++) {
if (grid[i][j] == 1) {
island += 1;
if ((i < grid.size() - 1) && grid[i+1][j]) neighbor += 1;
if ((j < grid[0].size() - 1) && grid[i][j+1]) neighbor += 1;
}
}
}
int perimeter = island * 4 - neighbor * 2;
return perimeter;
}
};