0为海洋,1为陆地,相连陆地组成小岛
求独立小岛个数
其实非常简单,只需要把每个不在标记内的点都进行一次深度搜索再标记即可
这里标记用的是path,其实也可以将走过的点标记为-1
备注:这其实就是一个求图中独立子图的个数问题,这个算法也叫Floodfill(种子填充法)
在计算机图形学中有广泛应用,可以用于图像分割,物体识别,绘图中的油漆桶工具,魔术棒工具
具体实现为查找种子点周边的点,将种子点颜色相近的点(可设置阀值)入队作为新种子,对新入队的种子进行同样的扩展操作
这样就选取了和最初种子相近颜色的区域
island=[[1,1,1,1,0,1,0,1,0], [1,0,1,0,0,0,0,1,1], [1,0,0,0,1,1,0,0,0], [1,1,1,1,1,0,1,1,0], [0,0,1,0,0,1,0,0,1], [0,1,0,1,1,1,1,1,0]] def dfs(path,cX,cY): connect=[(0,1),(1,0),(-1,0),(0,-1)] for c in connect: nX=cX+c[0] nY=cY+c[1] if nX>=0 and nX<6 and nY>=0 and nY<9: if (nX,nY) not in path and island[nX][nY]!=0: path.append((nX,nY)) dfs(path,nX,nY) def get_island_num(path,count): for i in range(6): for j in range(9): if island[i][j]==1 and (i,j) not in path: count+=1 dfs(path,i,j) return count counts=0 paths=[] print(get_island_num(paths,counts))