这是我解决这个问题的类似 DFS 的方法(复杂度 O(rows * columns)):
# given array
ayyyarray = [
[1,1,1,2,2],
[1,1,2,3,2],
[2,2,2,3,1],
[2,1,0,3,2],
[2,0,3,3,0]]
# function that mark "color" on cell and call take_a_tour for all neighbours with the same number
def take_a_tour(ayyyarray, visited, y, x, act_group_number, group_members_cnt):
visited[y][x] = act_group_number
if act_group_number in group_members_cnt:
group_members_cnt[act_group_number] += 1
else:
group_members_cnt[act_group_number] = 1
if (x + 1 < len(ayyyarray[y])) and (visited[y][x + 1] == 0) and (ayyyarray[y][x + 1] == ayyyarray[y][x]):
take_a_tour(ayyyarray, visited, y, x + 1, act_group_number, group_members_cnt)
if (y + 1 < len(ayyyarray)) and (visited[y + 1][x] == 0) and (ayyyarray[y + 1][x] == ayyyarray[y][x]):
take_a_tour(ayyyarray, visited, y + 1, x, act_group_number, group_members_cnt)
if (x - 1 >= 0) and (visited[y][x - 1] == 0) and (ayyyarray[y][x - 1] == ayyyarray[y][x]):
take_a_tour(ayyyarray, visited, y, x - 1, act_group_number, group_members_cnt)
if (y - 1 >= 0) and (visited[y - 1][x] == 0 ) and (ayyyarray[y - 1][x] == ayyyarray[y][x]):
take_a_tour(ayyyarray, visited, y - 1, x, act_group_number, group_members_cnt)
# 0 if not painted, color code(group_number) if already painted
visited = [[0 for _ in range(len(ayyyarray[x]))] for x in range(len(ayyyarray))]
# actual color we are using to paint same cells
act_group_number = 1
# dictionary to store pairs [color : number_of_cells_using_this_color]
group_members_cnt = {}
# for every cell i call take_a_tour.
for y in range(len(ayyyarray)):
for x in range(len(ayyyarray[y])):
if not visited[y][x]:
take_a_tour(ayyyarray, visited, y, x, act_group_number, group_members_cnt)
act_group_number += 1
# setting 0 for every cell that are painted with color used in >= 5 cells.
for y in range(len(ayyyarray)):
for x in range(len(ayyyarray[y])):
if group_members_cnt[visited[y][x]] >= 5:
ayyyarray[y][x] = 0
# print result
for y in ayyyarray:
print(y)