一尘不染

泛洪填充Python

algorithm

我是Flood
Fill算法的新手。我从Wikipedia(http://en.wikipedia.org/wiki/Flood_fill)中签出了它。但是并没有变得那么明智。我正在尝试在以下情况下使用它。我有一个矩阵:

matrix = [["a", "a", "b", "a", "a", "b"],
          ["a", "b", "b", "a", "b", "b"],
          ["b", "a", "b", "a", "a", "b"],
          ["b", "a", "b", "a", "b", "b"],
          ["a", "a", "b", "a", "a", "a"],
          ["a", "b", "b", "a", "a", "b"]]

然后让用户从矩阵中确定一个点。如果在给定的点上"b"什么也没做。在另一种情况下,如果要在给定点处使用洪水填充算法"a"将给定点以及
所有周围或连接的点"a"更改为“ c”。

例如,假设用户决定了matrix [0] [0]。那么新矩阵将是:

matrix = [["c", "c", "b", "a", "a", "b"],
          ["c", "b", "b", "a", "b", "b"],
          ["b", "a", "b", "a", "a", "b"],
          ["b", "a", "b", "a", "b", "b"],
          ["a", "a", "b", "a", "a", "a"],
          ["a", "b", "b", "a", "a", "b"]]

让我们继续该示例,并说用户选择了新的点matrix [3] [1]。然后我们将有:

matrix = [["c", "c", "b", "a", "a", "b"],
          ["c", "b", "b", "a", "b", "b"],
          ["b", "c", "b", "a", "a", "b"],
          ["b", "c", "b", "a", "b", "b"],
          ["c", "c", "b", "a", "a", "a"],
          ["c", "b", "b", "a", "a", "b"]]

我正在尝试构建一个函数Floodfill(matrix,x,y),到目前为止,我已经提出了这一点:

def floodfill(matrix, x, y):
    if matrix[y][x] == "b":
        return matrix
    elif matrix[y][x] == ".":
        stack = []

您有办法引导我继续吗?试图在SOF上查看洪水填充示例,但它们似乎不适合我的情况。至少我无法将这些示例应用于我的代码。洪水填充似乎不是这里的热门话题…但是,再次感谢您的帮助!


阅读 290

收藏
2020-07-28

共1个答案

一尘不染

好吧,洪水填充的想法是:

  1. 检查该点是否符合条件。
  2. 如果是的话,将其更改为“ c”(在您的情况下)-并在所有周围的单元格上调用泛洪填充。

类似于python的伪代码:

def floodfill(matrix, x, y):
    #"hidden" stop clause - not reinvoking for "c" or "b", only for "a".
    if matrix[x][y] == "a":  
        matrix[x][y] = "c" 
        #recursively invoke flood fill on all surrounding cells:
        if x > 0:
            floodfill(matrix,x-1,y)
        if x < len(matrix[y]) - 1:
            floodfill(matrix,x+1,y)
        if y > 0:
            floodfill(matrix,x,y-1)
        if y < len(matrix) - 1:
            floodfill(matrix,x,y+1)
2020-07-28