Python 巨蟒的洪水填充

Python 巨蟒的洪水填充,python,algorithm,function,matrix,flood-fill,Python,Algorithm,Function,Matrix,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

我完全不熟悉洪水填充算法。我从维基百科()上查到的。但并没有变得那么聪明。我试着在下面的情况下使用它。我有一个矩阵:

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”

例如,假设用户决定矩阵[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"]]
让我们继续这个例子,假设用户决定新的点,矩阵[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(矩阵,x,y),到目前为止,我已经得出了以下结论:

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

你有办法引导我继续吗?试着在SOF上查看洪水填充示例,但它们似乎不适合我的情况。至少我不能将这些示例应用到我的代码中。洪水填充似乎不是这里流行的话题。。。但是,我们再次感谢您的帮助

嗯,洪水填充的想法是:

  • 检查该点是否符合标准
  • 如果是,将其更改为“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)
    
    def泛光填充(矩阵,x,y): #“隐藏”停止条款-不为“c”或“b”重新调用,仅为“a”。 如果矩阵[x][y]=“a”: 矩阵[x][y]=“c” #在所有周围单元上递归调用整体填充: 如果x>0: 洪水填充(矩阵,x-1,y) 如果x0: 漫灌(基质,x,y-1) 如果yPython图像处理库中有几种泛洪填充算法的实现。我知道两个:和。前者是用Python实现的,使用的算法类似于上面amit回答中的算法。后者在C++中使用概念上相似的算法,但没有递归,使它更有效(大约25x大图像)。 要使用OpenCV的floodFill,您需要将矩阵转换为整数的np.array,具体操作如下:

    import numpy as np
    import cv2
    
    matrix_np = np.asarray(matrix)
    numeric_matrix = np.where(matrix_np=="a", 255, 0).astype(np.uint8)
    mask = np.zeros(np.asarray(numeric_matrix.shape)+2, dtype=np.uint8)
    start_pt = (y,x)
    if matrix_np[start_pt]:
      cv2.floodFill(numeric_matrix, mask, start_pt, 255, flags=4)
    mask = mask[1:-1, 1:-1]
    matrix_np[mask==1] = "c"
    matrix = matrix_np.tolist()
    
    使用上面给出的示例矩阵和x,y=(0,0),这将
    矩阵设置为

    [['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']]
    

    不多我把它更新到我的第一篇文章。现在我只知道我必须构建一个堆栈。对于实际的Python实现-,在
    if
    true
    分支中返回矩阵,但在
    false
    分支中不返回矩阵,就像OP那样。矩阵已修改到位,因此无需返回。实际上,仅仅比较a就足够了。@rodrigo是的,谢谢。我拿了他的代码,正如前面所说的,只是显示了更改应该是什么样子的伪代码。我解决了这个问题。。好啊现在我开始明白这是怎么回事了。我尝试过这个想法,它在矩阵[0][0]到矩阵[4][0]之间运行得很好,但是矩阵[5][0]给出了一个错误
    索引器:列表索引超出范围
    @Waldema:只是其中的一些。。。让我来修正一下,看起来amit是AFK:-(@rodrigo,谢谢,有点忙。没有对索引做太多考虑,这就是为什么我明确表示这是一个类似python的伪代码(因此没有100%准备好运行,但足以理解重要问题)。