法一:遍历每个方格,判断四周的位置,如果是边界外或者是水域则ans++
法二优化:由于只有一个岛屿,所以可以优化到只遍历它周围的格子
class Solution {
public:
int flag[105][105];
int xy[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
int dfs(vector<vector<int>>& grid, int x, int y) {
if (!grid[x][y]) return 1;
int n = grid.size(), m = grid[0].size(), ans = 0;
flag[x][y] = 1;
for (int i = 0; i < 4; ++i) {
int xx = x + xy[i][0];
int yy = y + xy[i][1];
if (xx < 0 || xx >= n || yy < 0 || yy >= m) {
ans++;
continue;
}
if (!flag[xx][yy]) ans += dfs(grid, xx, yy);
}
return ans;
}
int islandPerimeter(vector<vector<int>>& grid) {
int n = grid.size(), m = grid[0].size(), ans = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (grid[i][j]) {
ans = dfs(grid, i, j);
return ans;
}
}
}
return ans;
}
};