其他分享
首页 > 其他分享> > 2020校招面试高频题,给定0-1矩阵,求其连通域的个数

2020校招面试高频题,给定0-1矩阵,求其连通域的个数

作者:互联网

面试某宇宙条,第一次让写,不会。

面试某bigo,第二次让写,不会。

面试某汤,第三面让写,不会。

真高频面试题。。。。。。。。。。。。。

源博客地址https://blog.csdn.net/wphkadn/article/details/100125148,看完他的叙述以后豁然开朗,其实就是一个简单的dfs或bfs问题。

在一般的无向图遍历中,一般邻近节点储存在邻接列表里,故而遍历时有针对性地选取当前节点的邻居加入待访问集合就可以轻松完成访问,而对于矩阵这种图的表示形式,却需要自己以某种规律寻找当前节点的邻居集合。

import numpy as np
import matplotlib.pyplot as plt


class solution:
    def __init__(self,im):
        self.im=im
        m,n=im.shape
        self.mask=[[0 for _ in range(n)] for _ in range(m)]
    def isValid(self,i,j,mask,im):
        m,n=im.shape
        return i>=0 and i<m and j>=0 and j<n and mask[i][j]==0 and im[i][j]==1

    def add(self,i,j,mask,im,q):
        if self.isValid(i,j,mask,im):
            q.append([i,j])
            self.mask[i][j]=1

    def bsfsolver(self):
        m,n=self.im.shape
        res=[]
        for i in range(m):
            for j in range(n):
                if self.mask[i][j]==1 or self.im[i][j]==0:
                    continue
                P,Q=list(),list()
                P.append([i,j])
                self.mask[i][j]=1
                while P:
                    temp=P.pop(0)
                    Q.append(temp)
                    self.add(temp[0]-1,temp[1],self.mask,im,P)
                    self.add(temp[0]+1,temp[1],self.mask,im,P)
                    self.add(temp[0],temp[1]-1,self.mask,im,P)
                    self.add(temp[0],temp[1]+1,self.mask,im,P)
                res.append(Q)
        return res


if __name__ =='__main__':
    im=np.zeros(shape=(120,120))
    im[1:10,6:20]=1
    im[7:20,15:50]=1
    im[26:40,25:60]=1
    im[45:80,66:90]=1

    s=solution(im)
    res=s.bsfsolver()
 
    cen=[]
    for i in range(len(res)):
        x=res[i]
        cenx=[x_[0] for x_ in x]
        ceny=[x_[1] for x_ in x]
        cen.append([sum(cenx)/len(cenx),sum(ceny)/len(ceny)])

    plt.figure(0)
    plt.imshow(im)

    for i,c in enumerate(cen):
        plt.text(c[1],c[0],str(i+1),fontsize=11)
    plt.show()
    print(len(res))







代码中为了测试方便,使用numpy生成测试用例,同时使用plt在图像上标记连通域的位置与次序,并且可视化。

其中使用DFS和BFS唯一的区别就是 temp=P.pop() 或是直接 temp=P.pop(0)

设计mask标记的的目的是标记已经访问过的节点坐标,设置为1.

 

由于不会上传图片,自己跑一下就能看到结果。

 

标签:标记,self,mask,面试,求其,im,2020,校招,节点
来源: https://blog.csdn.net/github_29705847/article/details/100523699