Рубрики
Без рубрики

Алгоритм заполнения наводнения

Описание заполнения наводнения, также известное как алгоритм заполнения семян, помогает нам найти подключенную область t … Теги с алгоритмами, питоном, программированием, рекурсией.

Описание

Заполнение наводнения, также известное как алгоритм заполнения семян, помогает нам найти подключенную область с узлом в многомерном массиве. Он широко известен своим использованием в программе для заполнения ковша, чтобы заполнить аналогично цветную область, а также используется в таких играх, как Minesweeper, Go и т. Д.

Следующая анимация показывает, как алгоритм заполнения наводнения заполняет область, подключенную к узлу с одинаковым цветом.

Алгоритм

Чтобы достичь этого, алгоритм работает следующим образом:

Входные параметры: source_node, color_to_replace, new_color

Шаг 1: Если Color_to_replace равен new_color, верните. Шаг 2: Иначе, если цвет source_node не равен Color_to_replace, затем верните. Шаг 3: Иначе установите цвет исходного_Ноде в new_color. Шаг 4: рекурсивно начните выполнять заполнение наводнения на следующих узлах:

  • Левый узл исходного_NODE, color_to_replace, new_color
  • Правый узел Source_node, Color_to_replace, New_color
  • Верхний узел Source_node, Color_to_replace, New_color
  • Узел ниже до исходного_NODE, color_to_replace, new_color

Шаг 5: возвращаться

Реализация

Давайте решим проблему, чтобы лучше понять это.

Вам дается изображение, представленное как 2D массив, строку и столбец исходного узла и нового цвета. Вам нужно раскрасить исходный узел и все его соседний узел, которые аналогично окрашены в качестве исходного узла.

Пример 1: Ввод: [[1,0,1], [1,1,0], [1,1,1]] источник, источник и новый выход: [[2,0,1],[2,2,0],[2,2,2]]

Пример 2: Ввод: [[0,0,0], [1,1,0], [1,0,1]] источник, источник и новый выход: [[0,0,0], [2,2,0] , [2,0,1]]]

Примечание. Попробуйте внедрить алгоритм самостоятельно, прежде чем перейти к решению, он, несомненно, поможет 🙂

Решение:

class Solution(object):
    def color_it(self, image, sr, sc, new_color):
        """
        :type image: List[List[int]]
        :type sr: int
        :type sc: int
        :type new_color: int
        :rtype: List[List[int]]
        """
        # Initiate an array to keep the track of visited elements
        # and color of the elements
        self.image = []

        for i in range(len(image)):
            self.image.append([])
            for j in range(len(image[i])):
                # Keep the track of color and if the node is already visited
                value = {"color": image[i][j], "visited": False}
                self.image[i].append(value)

        current_color = image[sr][sc]

        self.flood_fill(image, sr, sc, current_color, new_color)

        for i in range(len(image)):
            for j in range(len(image[i])):
                image[i][j] = self.image[i][j]["color"]
        return image

    def flood_fill(self, image, row, col, current_color, new_color):
        if row < 0 or row >= len(image) or col < 0 or col >= len(image[0]):
            return

        if image[row][col] != current_color:
            return
        elif image[row][col] == current_color and self.image[row][col]["visited"]:
            return
        elif image[row][col] == current_color and not self.image[row][col]["visited"]:
            self.image[row][col]["color"] = new_color
            self.image[row][col]["visited"] = True

        # Recursively call flood_fill for adjacent nodes
        self.flood_fill(image, row + 1, col, current_color, new_color)
        self.flood_fill(image, row - 1, col, current_color, new_color)
        self.flood_fill(image, row, col + 1, current_color, new_color)
        self.flood_fill(image, row, col - 1, current_color, new_color)

Оригинал: “https://dev.to/ashishpanchal/flood-fill-algorithm-2blj”