Показать сообщение отдельно
Старый 08.02.2015, 15:48   #5
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
Ответ: Алгоритм заливки массива

Если забить на скорость выполнения:
пусть 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;  
//клеток не найдено, всё обработано. конец
} 
Можно его очень сильно ускорить, но я писал так, чтобы было максимально понятно.
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
MoteX (08.02.2015)