题目描述
有一个n*m的数组grid,数组值为0或1,为1之处代表房间,相邻的1是同一所屋子的房间(斜线相邻不算),求一共有多少屋子?
如
0 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;
}