Используйте 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) для размера области; изображение меняется на месте.