0
点赞
收藏
分享

微信扫一扫

解决岛屿类问题(网格)通用解法DFS(附题)

 

 

 

 

 

 力扣695

class Solution {
public:
   
   bool check(vector<vector<int>>&grid,int r,int c)
   {
       return 0<=r&&r<grid.size()&&0<=c&&c<grid[0].size();
   }//直接用1一个return判断是否符合
    int max_area=0;
    int area;//写两个全局变量,遍历之前area置0,每遍历一个格子area+1,一次调用结束,更新max_area
    void dfs(vector<vector<int>>&grid,int r,int c)
    {
        if(!check(grid,r,c))
           return;
        if(grid[r][c]!=1)
           return;
        area++;
        grid[r][c]=2;
        dfs(grid,r-1,c);
        dfs(grid,r+1,c);
        dfs(grid,r,c-1);
        dfs(grid,r,c+1);
    }
    int maxAreaOfIsland(vector<vector<int>>& grid) {
int row=grid.size();
int col=grid[0].size();



for(int i=0;i<row;i++)
{
    for(int j=0;j<col;j++)
    {
        if(grid[i][j]==1)
        {
            area=0;
            dfs(grid,i,j);
            max_area=max(area,max_area);
        }

    }
}
return max_area;
    }
};

200. 岛屿数量

class Solution {
public:
    int count=0;
    bool check(vector<vector<char>>& grid,int r,int c)
    {
        return 0<=r&&r<grid.size()&&c>=0&&c<grid[0].size();
    }
    void dfs(vector<vector<char>>& grid,int r,int c)
    {
        if(!check(grid,r,c))
        {
            return;
        }
        if(grid[r][c]!='1')return;
        grid[r][c]='2';
        dfs(grid,r+1,c);
        dfs(grid,r-1,c);
        dfs(grid,r,c+1);
        dfs(grid,r,c-1);
    }
    int numIslands(vector<vector<char>>& grid) {
    int row=grid.size();
    int col=grid[0].size();
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<col;j++)
        {
            if(grid[i][j]=='1')
            {
              count++;
              dfs(grid,i,j);
            }
        }
    }
    return count;
    }
};

63. 岛屿的周长

class Solution {
public:
bool check(vector<vector<int>>& grid,int r,int c)
{
    return 0<=r&&r<grid.size()&&c>=0&&c<grid[0].size();
}
    int dfs(vector<vector<int>>& grid,int r,int c)
    {
        if(!check(grid,r,c))return 0; 
        if(grid[r][c]!=1)return 0;
        //如果有(r,c)有4个邻接结点,return 0+dfs()....
        //如果......有3个邻接顶点,return 1+dfs()
        //.....
        grid[r][c]=2;
        int count=4;
        if(r-1>=0&&(grid[r-1][c]==1||grid[r-1][c]==2))count--;
        if(c-1>=0&&(grid[r][c-1]==1||grid[r][c-1]==2))count--;
        if(r+1<grid.size()&&(grid[r+1][c]==1||grid[r+1][c]==2))count--;
        if(c+1<grid[0].size()&&(grid[r][c+1]==1||grid[r][c+1]==2))count--;
        return count+dfs(grid,r-1,c)+dfs(grid,r+1,c)+dfs(grid,r,c-1)+dfs(grid,r,c+1);


    }
    int islandPerimeter(vector<vector<int>>& grid) {
int row=grid.size();
int col=grid[0].size();
int ans=0;
for(int i=0;i<row;i++)
{
    for(int j=0;j<col;j++)
    {
        if(grid[i][j]==1)
        {
            
             ans=dfs(grid,i,j);
        }
    }
}
return ans;
}
};

参考

:力扣

举报

相关推荐

0 条评论