Вы перебираете регионы по линии сканирования, переходя влево-вправо сверху вниз. Для каждой ячейки вы создаете список ячеек, совместно используемых одним и тем же объектом памяти между ячейками. Для каждой ячейки вы добавляете текущую ячейку в список (совместно с ней или созданные). Затем, если ячейка справа или снизу имеет одинаковый цвет, вы делитесь этим списком с этой ячейкой. Если в этой ячейке уже есть список, вы объединяете списки и заменяете ссылку на объект списка в каждой ячейке, указанной в списках, новым объединенным списком.
Затем в каждой ячейке находится ссылка на список, который содержит каждую смежную ячейку с этой ячейкой. Это удачно сочетает работу заливки между каждой ячейкой. Вместо того, чтобы повторять это для каждой клетки. Поскольку у вас есть списки, замена данных объединенными данными - это просто перебор списка. Это будет O (n * c), где n - количество ячеек, а c - мера соприкосновения графа. Полностью разрозненная сетка будет n раз. Полностью смежный одноцветный граф с n ^ 2 / 2.