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 ответа

Ваша первая матрица работает, потому что это квадратная матрица, в которой количество строк и количество столбцов равно = 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 Команда, чтобы получить соответствующее количество строк и столбцов.

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

Ты хочешь matrix[y][x]не matrix[x][y],

Другие вопросы по тегам