Заполнение связанной области в двумерном изображении

Используйте flood fill: обходите соседние пиксели исходного цвета от выбранной точки и перекрашивайте их. Нужно заранее определить связность — обычно по четырём сторонам.

Короткий ответ

Что ответить на собеседовании

Используйте flood fill: обходите соседние пиксели исходного цвета от выбранной точки и перекрашивайте их. Нужно заранее определить связность — обычно по четырём сторонам.

Подробный разбор

Ответ с пояснениями

Условие

Дано изображение, представленное как двумерный массив чисел, где каждое число обозначает цвет отдельного пикселя. Необходимо реализовать программу, которая заменит цвет выбранного региона на новый, имитируя работу инструмента «Заливка» в графических редакторах.

Ответ

Используйте flood fill: обходите соседние пиксели исходного цвета от выбранной точки и перекрашивайте их. Нужно заранее определить связность — обычно по четырём сторонам.

static void fill(int[][] image, int row, int col, int color) {
    int old = image[row][col];
    if (old == color) return;
    int[][] directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    var queue = new java.util.ArrayDeque<int[]>();
    image[row][col] = color;
    queue.add(new int[]{row, col});
    while (!queue.isEmpty()) {
        int[] p = queue.remove();
        for (int[] d : directions) {
            int r = p[0] + d[0], c = p[1] + d[1];
            if (r >= 0 && r < image.length && c >= 0 && c < image[r].length
                    && image[r][c] == old) {
                image[r][c] = color;
                queue.add(new int[]{r, c});
            }
        }
    }
}

Предполагаются ненулевые строки массива и корректная начальная точка. Перекрашивание при добавлении предотвращает повторную постановку. Время и очередь O(k) для размера области; изображение меняется на месте.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее