leetcode1020

之前在《啊哈!算法》中看到过这类题。不过这道题的飞地是不能在边界的,既然知道了不能在边界,那我们不就可以先有个思路,先处理边界,在遍历边界内飞地的数量了嘛。我参考了题解还是想了很久,就看着题解发呆,然后又看了题目要求的那两幅图才发现,我是真的菜鸡,太缺乏思考了,没有题解我都不知道能不能写出来,害!

void dfs(int**grid,int row,int col,int x,int y)
{    //判断是否越界或访问过
    if(x<0||x>=row||y<0||y>=col||grid[x][y]==0)
    {
        return;
    }
    grid[x][y]=0;//把相连的1变成0
    dfs(grid,row,col,x+1,y);
    dfs(grid,row,col,x-1,y);
    dfs(grid,row,col,x,y+1);
    dfs(grid,row,col,x,y-1);

}
int numEnclaves(int** grid, int gridSize, int* gridColSize){
    int row=gridSize,col=*gridColSize;
    int ret=0;
    //处理边界上的1
    //处理第一行和最后一行
    for(int i=0;i<row;i++)
    {
        if(grid[i][0]==1)
        {
            dfs(grid,row,col,i,0);
        }
        if(grid[i][col-1]==1)
        {
            dfs(grid,row,col,i,col-1);
        }
    }
    //处理第一列和最后一列
    for(int i=0;i<col;i++)
    {
        if(grid[0][i]==1)
        {
            dfs(grid,row,col,0,i);
        }
        if(grid[row-1][i]==1)
        {
            dfs(grid,row,col,row-1,i);
        }
    }
    //边界内遍历
    for(int i=1;i<row-1;i++)
    {
        for(int j=1;j<col-1;j++)
        {
            if(grid[i][j]==1)
            {
                ret++;
            }
        }
    }
    return ret;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值