Показать сообщение отдельно
Старый 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=0y<heighty++)
    for(
int x=0x<widthx++)
        if (
arr[x+y*width]==color){
        
тут цикл по соседям (напримеру кого x и y отличаются на единицу)
        
для каждого соседа по координатам xnyn{
            if (
arr[xn width*yn]==0){
                 
arr[xn width*yn] = color;
                 
changed++;
             }
        }
    }
return 
changed
}

сам алгоритм
label
:
for(
int color1;;color++){   
    for(
int i=0i<width*heighti++)  //ищем необработанные клетки
        
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)