Flood fill работает только на матрице в квадрате? - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь реализовать заливку, чтобы найти все доступные ячейки в сетке, из которых мой робот может перейти.если ячейка занята, ее значение будет равно 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 голосов
/ 20 декабря 2018

При доступе к элементам в матрице сначала указывается индекс строки (матрица - это массив строк), за которым следует индекс столбца (каждая строка - это массив чисел).

Вы хотите matrix[y][x], а не matrix[x][y].

0 голосов
/ 20 декабря 2018

Ваша первая матрица работает, потому что это квадратная матрица, в которой количество строк и количество столбцов равны = 10.

Во втором случае ваша матрица не является квадратной матрицей, потому что у вас есть 10строки (переменная x), но только 9 столбцов (переменная y).Следовательно, когда вы делаете

y < len(matrix) - 1

len(matrix) - это 10, что означает, что вы поднимаетесь до y < 9.В противном случае вы получите «List Index Out of Range Error».Чтобы получить правильные числа, вы должны проверить по длине ваших строк, которая дает вам количество столбцов.Одним из способов является использование длины первого ряда как len(matrix[0]).

Аналогично, для x вы должны использовать соответствующее количество строк, к которым можно получить доступ, используя len(matrix), равное 10 в вашем случае.Таким образом, вы должны использовать

if x < len(matrix) - 1

вместо if x < len(matrix[y]) - 1:, так как juvian также указал это в комментариях.

Другой способ - преобразовать ваш список списков.в массив NumPy и используйте команду shape, чтобы получить соответствующее количество строк и столбцов.

...