连通区域求解 - 2 python
题目:对一个矩阵(列表),求解其所有的联通区域,并输出;同时找出最大连通区域
思路:用回归的方法先进行标记并进行计数ret,然后再进行遍历;建立字典{key = mask: value = ret}。对字典中的值进行正向排序,获取计数最大也就是连通区域最大的标记值mask,遍历输出mask对应的位置信息。
'''
1, 0, 0, 0, 1
0, 1, 0, 1, 1
1, 0, 1, 0, 1
1, 0, 1, 0, 0
'''
import numpy as np
pic_table = np.array([
[1, 0, 0, 0, 1],
[0, 1, 0, 1, 1],
[1, 0, 1, 0, 1],
[1, 0, 1, 0, 0]
])
rows, cols = pic_table.shape
label_table = np.zeros((rows, cols))
def label_pro(i, j, mask):
if i < 0 or i >= rows or j < 0 or j >= cols or pic_table[i][j] == 0 or label_table[i][j] != 0:
return 0
else:
label_table[i][j] = mask
ret = 1
ret += label_pro(i - 1, j, mask)
ret += label_pro(i + 1, j, mask)
ret += label_pro(i, j - 1, mask)
ret += label_pro(i, j + 1, mask)
return ret
if __name__ == "__main__":
mask = 1
ret = 0
res = {}
for i in range(rows):
for j in range(cols):
if pic_table[i][j] != 0 and label_table[i][j] == 0:
ret = label_pro(i, j, mask)
res[mask] = ret
mask += 1
print(label_table)
sorted_table = [(k, res[k]) for k in sorted(res, key=res.get, reverse=True)]
max_grp = sorted_table[0][0]
for i in range(rows):
for j in range(cols):
if label_table[i][j] == max_grp:
print("(%d, %d) -> %d"%(i, j, max_grp))
结果:
PS. 默认认为只有一个最大的连通区域,忽略两个或两个以上最大连通区域的情况。