这是一道今日头条2018年校招第三次笔试的题目,原题如下
通用的思路都是DFS和BFS,我这里想说的并不是这两个,而是图像处理中的连通域分析思想
简单画了个示意图,步骤如下:
1 分析取得每一行的连通区域,图中红色表示部分
2,初始化连通域总数SUM=0
3,开始向下检测,SUM = SUM + 该行连通域的个数
4,逐个检测该行中的连通域是否与上一行中每一个连通域有交集,有则SUM = SUM -1,没有则集训
5, 循环3,4步直到结束,输出SUM
代码如下:
m = [
[1,0,0,0,0],
[0,0,1,1,0],
[0,1,0,0,0],
[0,0,1,0,0],
[1,0,1,0,0],
]
l = len(m)
lists = []
for i in range(l):
tmp_line = []
tmp = [0,0]
flag = False
for j in range(l):
if m[i][j] == 1:
if flag is True:
tmp[1] = j
else:
tmp[0] = j
flag = True
else:
if flag is True:
tmp[1] = j
tmp_line.append(tmp)
tmp = [0,0]
flag = False
if flag is True:
tmp[1] = l-1
tmp_line.append(tmp)
flag = False
lists.append(tmp_line)
print(lists)
sum1 = len(lists[0])
for i in range(1,l):
queue = lists[i-1]
sum1 += len(lists[i])
for ls in lists[i]:
if len(ls) == 0:
continue
if len(queue) == 0:
continue
if i != l - 2:
depend_size = 0
a = ls[0]
b = ls[1]
for k in queue:
# 独立单元
if k[0] >= b or k[1]<=a:
continue
else:
sum1 -=1
print(sum1)
运行结果如下:
[[[0, 1]], [[2, 4]], [[1, 2]], [[2, 3]], [[0, 1], [2, 3]]]
5
共有5个连通域
这题还可以变化为8连通,坐标位置的8个方向都视为连通,有兴趣可以考虑下