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上查看洪水填充示例,但它们似乎不适合我的情况。至少我不能将这些示例应用到我的代码中。洪水填充似乎不是这里流行的话题。。。但是,我们再次感谢您的帮助 嗯,洪水填充的想法是:
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)
如果ximport 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%准备好运行,但足以理解重要问题)。