最美房子编程题

题目描述

有一个n*m的数组grid,数组值为0或1,为1之处代表房间,相邻的1是同一所屋子的房间(斜线相邻不算),求一共有多少屋子?

0 0 0 0 0 

1 1 0 0

0 0 0 0 0

0 0 0 1 1

0 0 0 0 0

则图中屋子总数则为2个。


分析

一开始想到的是利用并查集的想法来做,考虑到时间复杂度,于是用链表来存储中间数据,越写越复杂了。。。

想了想dfs,发现可以在O(n*m)的时间复杂度得出结果,于是赶紧改用dfs的方法来做。对于搜索过的位置将grid中置为0,下次不再进行dfs。统计一共进行了多少次dfs就是结果(递归下去的dfs不计算次数)。

这种方法叫做Seed-Filling算法,用于连通区域分析。

代码

void Dfs(int grid[][], int n, int m,int x,int y,int nk) //nk可以去除
{
    if(grid[x][y]){
        grid[x][y]=0;
        if(x-1>=0)
            Dfs(grid,n,m,x-1,y,nk);
        if(y-1>=0)
            Dfs(grid,n,m,x,y-1,nk);
        if(x+1<n)
            Dfs(grid,n,m,x+1,y,nk);
        if(y+1<m)
            Dfs(grid,n,m,x,y+1,nk);
    }
}

int countHomes(int grid[][], int n, int m)
{
    int i,j;
    int ans=0;
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            if(grid[i][j]){
                ans++;
                Dfs(grid,n,m,i,j,grid[i][j]);
            }
        }
    }
    return ans;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值