一、题目
给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。
网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
示例 :
输入: [[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]] 输出: 16 解释: 它的周长是下面图片中的 16 个黄色的边:
二、题解思路
- 题解思路:遍历行列,四周无岛屿的独立大于周长为4,只要其左或右或上或下出现岛屿,周长就减一,最后将判断完毕后此岛屿的周长剩余值 加到总的周长上。
三、代码实现
- C++代码实现
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid)
{
int size_1 = grid.size(); //行
int size_2 = grid[0].size(); //列
int land_grith = 0; //周长
for(int i = 0;i<size_1;i++)
{
for(int j = 0;j<size_2;j++)
{
if(grid[i][j]==1)
{
int counts = 4; //针对每一个四周独立的时候周长是4
if(j-1 >= 0 && grid[i][j-1] == 1) //遇到左边有岛屿
counts--; //周长减一
if(j+1 <= size_2-1 && grid[i][j+1] == 1) //遇到右边有岛屿
counts--;
if(i-1 >= 0 && grid[i-1][j] == 1) // 遇到正上方有岛屿
counts--;
if(i+1 <= size_1-1 && grid[i+1][j] == 1) //遇到正下方有岛屿
counts--;
land_grith += counts; //叠加周长
}
}
}
return land_grith;
}
};
四、知识点学习
- 短路法则
短路法则称为快速死亡法则,也就是当部分表达式的计算可以产生结果的时候就执行跳转,余下的表达式则不被计算。主要指的是逻辑与(&&)和逻辑或(||)。如果其左侧表达式求值出来之后决定了结果,则右侧表达式的求值和副作用都不会发生。
代码中的实例:
j-1 >= 0 && grid[i][j-1] == 1
j+1 <= size_2-1 && grid[i][j+1] == 1
i-1 >= 0 && grid[i-1][j] == 1
i+1 <= size_1-1 && grid[i+1][j] == 1