Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 需要帮助修改洪水填充算法吗_Python_Recursion_Flood Fill - Fatal编程技术网

Python 需要帮助修改洪水填充算法吗

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],

我正在尝试修改泛光填充算法以返回最终的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],
          [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) 如果y0且矩阵[x-1][y]==color1且矩阵[x-1][y]!=颜色2: 矩阵=填充(矩阵,x-1,y,颜色1,颜色2) 返回矩阵
任何帮助都将不胜感激。谢谢

只需返回矩阵即可:

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):
如果您需要矩阵的副本,请阅读为什么要递归地执行此操作,这是非常困难的