## 题目链接 https://leetcode-cn.com/problems/island-perimeter/ ## 思路 岛屿问题最容易让人想到BFS或者DFS,但是这道题还真的没有必要,别把简单问题搞复杂了。 ### 解法一: 遍历每一个空格,遇到岛屿,计算其上下左右的情况,遇到水域或者出界的情况,就可以计算边了。 如图: C++代码如下:(详细注释) ```C++ class Solution { public: int direction[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; int islandPerimeter(vector>& grid) { int result = 0; for (int i = 0; i < grid.size(); i++) { for (int j = 0; j < grid[0].size(); j++) { if (grid[i][j] == 1) { for (int k = 0; k < 4; k++) { // 上下左右四个方向 int x = i + direction[k][0]; int y = j + direction[k][1]; // 计算周边坐标x,y if (x < 0 // i在边界上 || x >= grid.size() // i在边界上 || y < 0 // j在边界上 || y >= grid[0].size() // j在边界上 || grid[x][y] == 0) { // x,y位置是水域 result++; } } } } } return result; } }; ``` ### 解法二: 计算出总的岛屿数量,因为有一对相邻两个陆地,边的总数就减2,那么在计算出相邻岛屿的数量就可以了。 result = 岛屿数量 * 4 - cover * 2; 如图: C++代码如下:(详细注释) ```C++ class Solution { public: int islandPerimeter(vector>& grid) { int sum = 0; // 陆地数量 int cover = 0; // 相邻数量 for (int i = 0; i < grid.size(); i++) { for (int j = 0; j < grid[0].size(); j++) { if (grid[i][j] == 1) { sum++; // 统计上边相邻陆地 if(i - 1 >= 0 && grid[i - 1][j] == 1) cover++; // 统计左边相邻陆地 if(j - 1 >= 0 && grid[i][j - 1] == 1) cover++; // 为什么没统计下边和右边? 因为避免重复计算 } } } return sum * 4 - cover * 2; } }; ```