Python 需要帮助修改洪水填充算法吗
我正在尝试修改泛光填充算法以返回最终的2D矩阵,其中所有的color1仅用color2着色。泛洪应从矩阵中的x,y开始 测试用例1: 之前:Python 需要帮助修改洪水填充算法吗,python,recursion,flood-fill,Python,Recursion,Flood Fill,我正在尝试修改泛光填充算法以返回最终的2D矩阵,其中所有的color1仅用color2着色。泛洪应从矩阵中的x,y开始 测试用例1: 之前: matrix = [[4, 3, 1, 2], [3, 1, 1, 2], [1, 2, 4, 5]] matrix = [[3, 2, 4], [5, 1, 4], [4, 3, 1]] matrix = [[2, 1, 1], [2, 1, 2],
matrix = [[4, 3, 1, 2],
[3, 1, 1, 2],
[1, 2, 4, 5]]
matrix = [[3, 2, 4],
[5, 1, 4],
[4, 3, 1]]
matrix = [[2, 1, 1],
[2, 1, 2],
[2, 2, 2]]
在matrix=fill之后(matrix,x=0,y=2,color1=1,color2=2)
测试用例2:
之前:
matrix = [[4, 3, 1, 2],
[3, 1, 1, 2],
[1, 2, 4, 5]]
matrix = [[3, 2, 4],
[5, 1, 4],
[4, 3, 1]]
matrix = [[2, 1, 1],
[2, 1, 2],
[2, 2, 2]]
在矩阵=填充后(矩阵,x=0,y=0,color1=3,color2=1)
测试用例3:
之前:
matrix = [[4, 3, 1, 2],
[3, 1, 1, 2],
[1, 2, 4, 5]]
matrix = [[3, 2, 4],
[5, 1, 4],
[4, 3, 1]]
matrix = [[2, 1, 1],
[2, 1, 2],
[2, 2, 2]]
在matrix=fill之后(matrix,x=1,y=2,color1=2,color2=1)
这与我在网站上发现的僵尸感染问题非常相似
目前,我有一个只修改全局矩阵的算法
def fill(matrix, x, y, color1, color2):
matWidth = len(matrix)
matHeight = len(matrix[0])
if x < 0 or y < 0 or x >= matWidth or y >= matHeight:
return
if matrix[x][y] == color2 or matrix[x][y] != color1:
return
if matrix[x][y] == color1:
matrix[x][y] = color2
fill(matrix, x - 1, y, color1, color2)
fill(matrix, x + 1, y, color1, color2)
fill(matrix, x, y - 1, color1, color2)
fill(matrix, x, y + 1, color1, color2)
def填充(矩阵、x、y、颜色1、颜色2):
matWidth=len(矩阵)
matHeight=len(矩阵[0])
如果x<0或y<0或x>=matWidth或y>=matHeight:
返回
如果矩阵[x][y]==color2或矩阵[x][y]!=颜色1:
返回
如果矩阵[x][y]==color1:
矩阵[x][y]=color2
填充(矩阵,x-1,y,颜色1,颜色2)
填充(矩阵,x+1,y,颜色1,颜色2)
填充(矩阵,x,y-1,颜色1,颜色2)
填充(矩阵,x,y+1,颜色1,颜色2)
有没有一种方法可以修改fill(),使其接受矩阵作为参数并返回最终填充的矩阵
非常感谢
我很快就能解决这个问题了。以下是我的解决方案:
def fill(matrix, x, y, color1, color2):
matWidth = len(matrix)
matHeight = len(matrix[0])
if x < 0 or y < 0 or x >= matWidth or y >= matHeight:
return matrix
if mat[x][y] != color1:
return matrix
else:
matrix[x][y] = color2
if x == 0:
if y == 0:
if matrix[x + 1][y] == color1 and color[x + 1][y] != color2:
matrix = fill(matrix, x + 1, y, color1, color2)
if matrix[x][y + 1] == color1 and matrix[x][y + 1] != color2:
matrix = fill(matrix, x, y + 1, color1, color2)
if y == matHeight - 1:
if matrix[x][y - 1] == color1 and matrix[x][y - 1] != color2:
matrix = fill(matrix, x, y - 1, color1, color2)
if matrix[x + 1][y] == color1 and matrix[x + 1][y] != color2:
matrix = fill(matrix, x + 1, y, color1, color2)
else:
if matrix[x][y - 1] == color1 and matrix[x][y - 1] != color2:
matrix = fill(matrix, x, y - 1, color1, color2)
if matrix[x][y + 1] == color1 and matrix[x][y + 1] != color2:
matrix = fill(matrix, x, y + 1, color1, color2)
if matrix[x + 1][y] == color1 and matrix[x + 1][y] != color2:
matrix = fill(matrix, x + 1, y, color1, color2)
if x == matWidth - 1:
if y == 0:
if matrix[x - 1][y] == color1 and matrix[x - 1][y] != color2:
matrix = fill(matrix, x - 1, y, color1, color2)
if matrix[x][y + 1] == color1 and matrix[x][y + 1] != color2:
matrix = fill(matrix, x, y + 1, color1, color2)
if y == matHeight - 1:
if matrix[x][y - 1] == color1 and matrix[x][y - 1] != color2:
matrix = fill(matrix, x, y - 1, color1, color2)
if matrix[x - 1][y] == color1 and matrix[x - 1][y] != color2:
matrix = fill(matrix, x - 1, y, color1, color2)
else:
if matrix[x][y - 1] == color1 and matrix[x][y - 1] != color2:
matrix = fill(matrix, x, y - 1, color1, color2)
if matrix[x][y + 1] == color1 and matrix[x][y + 1] != color2:
matrix = fill(matrix, x, y + 1, color1, color2)
if matrix[x - 1][y] == color1 and matrix[x - 1][y] != color2:
matrix = fill(matrix, x - 1, y, color1, color2)
if y > 0 and matrix[x][y-1] == color1 and matrix[x][y-1] != color2:
matrix = fill(matrix, x, y-1, color1, color2)
if y < matHeight and matrix[x][y+1] == color1 and matrix[x][y+1] != color2:
matrix = fill(matrix, x, y-1, color1, color2)
if x < matWidth and matrix[x+1][y] == color1 and matrix[x+1][y] != color2:
matrix = fill(matrix, x+1, y, color1, color2)
if x > 0 and matrix[x-1][y] == color1 and matrix[x-1][y] != color2:
matrix = fill(matrix, x-1, y, color1, color2)
return matrix
def填充(矩阵、x、y、颜色1、颜色2):
matWidth=len(矩阵)
matHeight=len(矩阵[0])
如果x<0或y<0或x>=matWidth或y>=matHeight:
返回矩阵
如果mat[x][y]!=颜色1:
返回矩阵
其他:
矩阵[x][y]=color2
如果x==0:
如果y==0:
如果矩阵[x+1][y]==color1和color[x+1][y]!=颜色2:
矩阵=填充(矩阵,x+1,y,颜色1,颜色2)
如果矩阵[x][y+1]==color1和矩阵[x][y+1]!=颜色2:
矩阵=填充(矩阵,x,y+1,颜色1,颜色2)
如果y==matHeight-1:
如果矩阵[x][y-1]==color1和矩阵[x][y-1]!=颜色2:
矩阵=填充(矩阵,x,y-1,颜色1,颜色2)
如果矩阵[x+1][y]==color1和矩阵[x+1][y]!=颜色2:
矩阵=填充(矩阵,x+1,y,颜色1,颜色2)
其他:
如果矩阵[x][y-1]==color1和矩阵[x][y-1]!=颜色2:
矩阵=填充(矩阵,x,y-1,颜色1,颜色2)
如果矩阵[x][y+1]==color1和矩阵[x][y+1]!=颜色2:
矩阵=填充(矩阵,x,y+1,颜色1,颜色2)
如果矩阵[x+1][y]==color1和矩阵[x+1][y]!=颜色2:
矩阵=填充(矩阵,x+1,y,颜色1,颜色2)
如果x==matWidth-1:
如果y==0:
如果矩阵[x-1][y]==color1和矩阵[x-1][y]!=颜色2:
矩阵=填充(矩阵,x-1,y,颜色1,颜色2)
如果矩阵[x][y+1]==color1和矩阵[x][y+1]!=颜色2:
矩阵=填充(矩阵,x,y+1,颜色1,颜色2)
如果y==matHeight-1:
如果矩阵[x][y-1]==color1和矩阵[x][y-1]!=颜色2:
矩阵=填充(矩阵,x,y-1,颜色1,颜色2)
如果矩阵[x-1][y]==color1和矩阵[x-1][y]!=颜色2:
矩阵=填充(矩阵,x-1,y,颜色1,颜色2)
其他:
如果矩阵[x][y-1]==color1和矩阵[x][y-1]!=颜色2:
矩阵=填充(矩阵,x,y-1,颜色1,颜色2)
如果矩阵[x][y+1]==color1和矩阵[x][y+1]!=颜色2:
矩阵=填充(矩阵,x,y+1,颜色1,颜色2)
如果矩阵[x-1][y]==color1和矩阵[x-1][y]!=颜色2:
矩阵=填充(矩阵,x-1,y,颜色1,颜色2)
如果y>0且矩阵[x][y-1]==color1且矩阵[x][y-1]!=颜色2:
矩阵=填充(矩阵,x,y-1,颜色1,颜色2)
如果y任何帮助都将不胜感激。谢谢只需返回矩阵即可:
def fill(matrix, x, y, color1, color2):
matWidth = len(matrix)
matHeight = len(matrix[0])
if x < 0 or y < 0 or x >= matWidth or y >= matHeight:
return matrix
if matrix[x][y] == color2 or matrix[x][y] != color1:
return matrix
if matrix[x][y] == color1:
matrix[x][y] = color2
fill(matrix, x - 1, y, color1, color2)
fill(matrix, x + 1, y, color1, color2)
fill(matrix, x, y - 1, color1, color2)
fill(matrix, x, y + 1, color1, color2)
return matrix
def填充(矩阵、x、y、颜色1、颜色2):
matWidth=len(矩阵)
matHeight=len(矩阵[0])
如果x<0或y<0或x>=matWidth或y>=matHeight:
返回矩阵
如果矩阵[x][y]==color2或矩阵[x][y]!=颜色1:
返回矩阵
如果矩阵[x][y]==color1:
矩阵[x][y]=color2
填充(矩阵,x-1,y,颜色1,颜色2)
填充(矩阵,x+1,y,颜色1,颜色2)
填充(矩阵,x,y-1,颜色1,颜色2)
填充(矩阵,x,y+1,颜色1,颜色2)
返回矩阵
或者,如果您不喜欢总是返回它,请使用包装器在最后只返回一次:
def fill(matrix, x, y, color1, color2):
def fill(matrix, x, y, color1, color2):
matWidth = len(matrix)
matHeight = len(matrix[0])
if x < 0 or y < 0 or x >= matWidth or y >= matHeight:
return
if matrix[x][y] == color2 or matrix[x][y] != color1:
return
if matrix[x][y] == color1:
matrix[x][y] = color2
fill(matrix, x - 1, y, color1, color2)
fill(matrix, x + 1, y, color1, color2)
fill(matrix, x, y - 1, color1, color2)
fill(matrix, x, y + 1, color1, color2)
fill(matrix, x, y, color1, color2)
return matrix
def填充(矩阵、x、y、颜色1、颜色2):
def填充(矩阵、x、y、颜色1、颜色2):
matWidth=len(矩阵)
matHeight=len(矩阵[0])
如果x<0或y<0或x>=matWidth或y>=matHeight:
返回
如果矩阵[x][y]==color2或矩阵[x][y]!=颜色1:
返回
如果矩阵[x][y]==color1:
矩阵[x][y]=color2
填充(矩阵,x-1,y,颜色1,颜色2)
填充(矩阵,x+1,y,颜色1,颜色2)
填充(矩阵,x,y-1,颜色1,颜色2)
填充(矩阵,x,y+1,颜色1,颜色2)
填充(矩阵、x、y、颜色1、颜色2)
返回矩阵
在这种情况下,还可以去掉大多数参数。这是一个我这样做的版本,并且使代码更简单:
def fill(matrix, x, y, color1, color2):
def fill(x, y):
if 0 <= x < matWidth and 0 <= y < matHeight and matrix[x][y] == color1:
matrix[x][y] = color2
fill(x - 1, y)
fill(x + 1, y)
fill(x, y - 1)
fill(x, y + 1)
matWidth = len(matrix)
matHeight = len(matrix[0])
fill(x, y)
return matrix
def填充(矩阵、x、y、颜色1、颜色2):
def加注(x,y):
如果您需要矩阵的副本,请阅读为什么要递归地执行此操作,这是非常困难的