Если забить на скорость выполнения:
пусть arr[] - массив длиной width*height, уже заполненный 0 и -1
//заполняет, говорит, сколько клеток изменил
int fill(int color){
int changed = 0;
for(int y=0; y<height; y++)
for(int x=0; x<width; x++)
if (arr[x+y*width]==color){
тут цикл по соседям (например, у кого x и y отличаются на единицу)
для каждого соседа по координатам xn, yn{
if (arr[xn + width*yn]==0){
arr[xn + width*yn] = color;
changed++;
}
}
}
return changed;
}
сам алгоритм
label:
for(int color= 1;;color++){
for(int i=0; i<width*height; i++) //ищем необработанные клетки
if(arr[i]==0){
arr[i] = color; //закрашиваем клетку
while(fill(color) != 0) {}//заполняем всех соседей, пока прогресс не прекратится
continue label; // выпрыгиваем в главный цикл, чтобы красить следующим цветом
}
break; //клеток не найдено, всё обработано. конец
}
Можно его очень сильно ускорить, но я писал так, чтобы было максимально понятно.