1020. 飞地的数量

1020. 飞地的数量


题目链接:1020. 飞地的数量

代码如下:

class Solution 
{
public:
    int numEnclaves(vector<vector<int>>& grid) 
    {
        //从左边和右边向中间遍历
        for(int i=0;i<grid.size();i++)
        {
            if(grid[i][0]==1)  
            {
                // dfs(grid,i,0);
                bfs(grid,i,0);
            }
            if(grid[i][grid[0].size()-1]==1)
            {
                // dfs(grid,i,grid[0].size()-1);
                bfs(grid,i,grid[0].size()-1);
            }    
        }
        //从上边边和下边边向中间遍历
        for(int j=0;j<grid[0].size();j++)
        {
            if(grid[0][j]==1)   
            {
                // dfs(grid,0,j);
                bfs(grid,0,j);
            }
            if(grid[grid.size()-1][j]==1)
            {
                // dfs(grid,grid.size()-1,j);
                bfs(grid,grid.size()-1,j);
            }    
        }
        count=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);
                    bfs(grid,i,j);
                }
            }
        }
        return count;
    } 

    //深度优先搜索
    // void dfs(vector<vector<int>>& grid,int x,int y)
    // {
    //     grid[x][y]=0;
    //     count++;
    //     for(int i=0;i<4;i++)
    //     {
    //         int nextX=x+dir[i][0];
    //         int nextY=y+dir[i][1];  
    //         if(nextX<0||nextX>=grid.size()||nextY<0||nextY>=grid[0].size())
    //             continue;
    //         //不符合条件,不继续遍历
    //         if(grid[nextX][nextY]==0)   continue;
    //         dfs(grid,nextX,nextY);
    //     }
    // }  

    //广度优先搜索
    void bfs(vector<vector<int>>& grid,int x,int y)
    {
        queue<pair<int,int>> que;
        que.push({x,y});
        grid[x][y]=0;// 只要加入队列,立刻标记
        count++;
        while(!que.empty())
        {
            auto cur=que.front();
            que.pop();
            for(int i=0;i<4;i++)
            {
                int nextX=cur.first+dir[i][0];
                int nextY=cur.second+dir[i][1];  
                if(nextX<0||nextX>=grid.size()||nextY<0||nextY>=grid[0].size())
                    continue;
                if(grid[nextX][nextY]==1)
                {
                    que.push({nextX,nextY});
                    count++;
                    grid[nextX][nextY]=0;
                }
            }
        }    
    }  
private:
    int dir[4][2] = {-1,0,0,-1,1,0,0,1}; // 保存四个方向
    int count; // 统计符合题目要求的陆地空格数量
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值