题目
给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。
网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
示例 1:
输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]] 输出:16 解释:它的周长是上面图片中的 16 个黄色的边
示例 2:
输入:grid = [[1]] 输出:4
示例 3:
输入:grid = [[1,0]] 输出:4
解题
方法一:dfs
朝4个方向遍历,如果grid[i][j]==0
或者超过边界,那么周长+1
class Solution { public: vector<vector<int>> dirs={{-1,0},{1,0},{0,-1},{0,1}}; int m,n; int res; void dfs(vector<vector<int>>& grid,int x,int y){ grid[x][y]=-1; for(vector<int>& dir:dirs){ int nx=x+dir[0]; int ny=y+dir[1]; if(nx<0||nx>=m||ny<0||ny>=n||grid[nx][ny]==0) res++; if(nx>=0&&nx<m&&ny>=0&&ny<n&&grid[nx][ny]==1){ dfs(grid,nx,ny); } } } int islandPerimeter(vector<vector<int>>& grid) { m=grid.size(); n=grid[0].size(); res=0; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(grid[i][j]==0||grid[i][j]==-1) continue; dfs(grid,i,j); return res; } } return -1; } };
方法二:模拟
class Solution { public: int islandPerimeter(vector<vector<int>>& grid) { int m=grid.size(),n=grid[0].size(); int res=0; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(grid[i][j]==1){ if(i-1<0||grid[i-1][j]==0) res++; if(j-1<0||grid[i][j-1]==0) res++; if(i+1>=m||grid[i+1][j]==0) res++; if(j+1>=n||grid[i][j+1]==0) res++; } } } return res; } };