给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1
思路:岛屿问题都可以用dfs来解决,不用回溯,而是遍历,遍历后要标记遍历过的点,回到之前时候不用回溯,不是找路径不需要回溯,只需要遍历过就可以。
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
int res=0;
for(int i=0;i<grid.size();i++)
for(int j=0;j<grid[0].size();j++){
if(grid[i][j]=='1'){
dfs(grid,i,j);
res++;
}
}
return res;
}
void dfs(vector<vector<char>>& grid,int x,int y){ //注意此时不是要求路径或者排列,而是要求遍历所有为1 的陆地,即回溯的时候不需要回溯,前面遍历过这次就不便利了
if(x<0 || x>=grid.size() || y<0 ||y>=grid[0].size() || grid[x][y]=='0')
return;
grid[x][y]='0';
dfs(grid,x-1,y);
dfs(grid,x+1,y);
dfs(grid,x,y-1);
dfs(grid,x,y+1);
}
};
463. 岛屿的周长
给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。
网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
输出:16
解释:它的周长是上面图片中的 16 个黄色的边
思路:同样的岛屿模板,如果遍历到0水域或者超出边界,就把周长加一
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid) {
int sum=0;
for(int i=0;i<grid.size();i++)
for(int j=0;j<grid[0].size();j++){
if(grid[i][j]==1){
dfs(grid,i,j,sum);
break;
}
}
return sum;
}
void dfs(vector<vector<int>>& grid,int i,int j,int& sum){
if(i<0 || i>=grid.size() || j<0 ||j>=grid[0].size() || grid[i][j]==0) {sum++;return; }
if(grid[i][j]==2) return;
grid[i][j]=2;
dfs(grid,i-1,j,sum);
dfs(grid,i+1,j,sum);
dfs(grid,i,j-1,sum);
dfs(grid,i,j+1,sum);
}
};
463. 给你一个大小为 m x n 的二进制矩阵 grid 。岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。岛屿的面积是岛上值为 1 的单元格的数目。计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。
输入:输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]
输出:6
解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。
class Solution {
public:
int maxAreaOfIsland(vector<vector<int>>& grid) {
int res=0;
for(int i=0;i<grid.size();i++)
for (int j = 0; j < grid[0].size(); j++) {
if (grid[i][j] == 1) {
int sum = 0;
dfs(grid,i,j,sum);
res = max(res,sum);
}
}
return res;
}
void dfs(vector<vector<int>>& grid,int i,int j,int & sum) {
if (i < 0 || i >= grid.size() || j<0 || j>=grid[0].size() || grid[i][j] == 0 ) return;
grid[i][j] = 0;
sum++;
dfs(grid,i-1,j,sum);
dfs(grid, i + 1, j, sum);
dfs(grid, i, j - 1, sum);
dfs(grid, i , j+1, sum);
}
};