洪水填充仅适用于平方矩阵?

时间:2018-12-20 14:18:19

标签: python algorithm grid flood-fill

我正在尝试实施洪水填充以查找网格中所有可用的单元格 我的机器人可以从中移动到的位置。如果一个单元格被占用,其值为1, 如果单元格空闲,则其值为0。我的代码似乎可以平方运算 矩阵,但不在其他矩阵上。在我的代码中,我用 数字2。

这是我的代码:

 def floodfill(matrix, x, y):

    if matrix[x][y] == 0:
        matrix[x][y] = 2

        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 main():

    maze = [[0, 1, 1, 1, 1, 0, 0, 0, 1, 0],
            [0, 1, 0, 1, 1, 0, 1, 0, 1, 0],
            [0, 1, 0, 1, 1, 0, 1, 0, 0, 0],
            [0, 1, 0, 0, 0, 0, 1, 0, 1, 0],
            [0, 1, 0, 1, 1, 0, 1, 0, 1, 0],
            [0, 1, 0, 1, 1, 0, 1, 0, 1, 1],
            [0, 1, 0, 1, 1, 0, 1, 0, 1, 0],
            [0, 1, 0, 1, 1, 0, 1, 0, 1, 0],
            [0, 1, 0, 1, 1, 0, 1, 0, 1, 0],
            [0, 0, 0, 1, 1, 0, 1, 0, 1, 0]]

    floodfill(maze, 0,0)
    print(maze)

并且此矩阵没有(删除最后一列的相同矩阵):

def main():

    maze = [[0, 1, 1, 1, 1, 0, 0, 0, 1],
            [0, 1, 0, 1, 1, 0, 1, 0, 1],
            [0, 1, 0, 1, 1, 0, 1, 0, 0],
            [0, 1, 0, 0, 0, 0, 1, 0, 1],
            [0, 1, 0, 1, 1, 0, 1, 0, 1],
            [0, 1, 0, 1, 1, 0, 1, 0, 1],
            [0, 1, 0, 1, 1, 0, 1, 0, 1],
            [0, 1, 0, 1, 1, 0, 1, 0, 1],
            [0, 1, 0, 1, 1, 0, 1, 0, 1],
            [0, 0, 0, 1, 1, 0, 1, 0, 1]]

    floodfill(maze, 0,0)
    print(maze)

感谢您的帮助。 谢谢!

2 个答案:

答案 0 :(得分:1)

您的第一个矩阵起作用是因为它是一个正方形矩阵,其中行数和列数等于10。

在第二种情况下,矩阵不是方阵,因为您有10行(x变量),但只有9列(y变量)。因此,当您

y < len(matrix) - 1

len(matrix)是10,表示您将上升到y < 9。否则,您将收到“列表索引超出范围错误”。为了获得正确的数字,您应该对照行的长度进行检查,以获取列数。一种方法是将第一行的长度用作len(matrix[0])

类似地,对于x,您应该使用可以使用len(matrix)访问的相应行数(在您的情况下为10)。因此,您应该使用

if x < len(matrix) - 1

而不是juvianhttp://localhost/signalr/hubs也在注释中指出了这一点。

其他方法是将列表列表转换为NumPy数组,并使用if x < len(matrix[y]) - 1:命令获取相应的行数和列数。

答案 1 :(得分:0)

访问矩阵中的元素时,行索引排在最前面(矩阵是行的数组),然后是列索引(每行是数字的数组)。

您要matrix[y][x],而不是matrix[x][y]