查找网格中的最大颜色数

时间:2018-07-10 19:18:51

标签: python algorithm

我发现了一个python示例问题,听起来像是“查找网格中连接颜色的最大数量”。换句话说,我必须找到最常见的颜色并将其连接在一起。在我的示例中,它是 0 ,重复了4次。我做了一个看起来像这样的网格。每个颜色都是一个数字。

arr = [[0,0,0,1],
       [1,0,2,1],
       [0,2,1,0]]

我不知道下一步该怎么做。我认为我必须开始遍历数组for i in arr:,但是接下来我要做什么?

1 个答案:

答案 0 :(得分:2)

您可以使用floodfill algorithm进行此操作。这是一个蛮力解决方案,并且肯定有改进的可能性。查看以下代码中的注释:

#do the floodfill and count number of fills
def floodfill_count(a, i, x, y, tot=0):
    if a[x][y] == i:
        a[x][y] = -1
        tot += 1
        #recursively invoke flood fill on all surrounding cells:
        if x > 0:
            tot = floodfill_count(a, i, x-1, y, tot)
        if x < len(a) - 1:
            tot = floodfill_count(a, i, x+1, y, tot)
        if y > 0:
            tot = floodfill_count(a, i, x, y-1, tot)
        if y < len(a[x]) - 1:
            tot = floodfill_count(a, i, x, y+1, tot)

    return tot

def max_color(arr):
    maxes = {}

    for x in range(len(arr)):
        for y in range(len(arr[x])):
            #color we are looking for
            query_num = arr[x][y]
            #has not been filled yet
            if query_num != -1:
                if query_num in maxes:
                    maxes[query_num] = max(maxes[query_num], floodfill_count(arr, query_num, x, y))
                else:
                    maxes[query_num] = floodfill_count(arr, query_num, x, y)
    #return key associated to max value
    return max(maxes, key=maxes.get)



arr = [[3,3,3,1],
       [1,0,2,1],
       [0,2,1,0]]

max_color = max_color(arr)
print ("max color: " + str(max_color))

这可以通过计算尚未填充的每种颜色的填充数,然后保存给定颜色的最大值来进行。在存储所有颜色值的最大值方面,该代码有些过高,但是这种方式可扩展为所需的应用程序(第二大颜色等)。我认为您可以简化以存储最大颜色和最大值(如果需要)。