Тема: Алгоритм
Показать сообщение отдельно
  #4  
Старый 10.01.2011, 14:41
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Например можно попробовать так:
Начинается цикл. Текущую клетку (координаты X и Y) закрашиваем. Смотим соседа слева (если имеется таковой).
Если его цвет нужный, то в массив (самодельный стек) заносим например 0 (чтоб знать что пришли слева), потом X уменьшаем на 1. Если же цвет не тот или нет соседа слева - аналогично для права, потом верха и потом низа, только заносить будем соответственно 1, 2 или 3.
Следующий проход цикла - имеем новые координаты, и делаем все то же для них.
Если у N-ной клетки не оказалось соседей - берем из массива направление, откуда пришли, и возвращаемся по нему, не выполняя сравнения для тех сторон, которые уже были (если например вернулись с цифрой 2, значит остается сравнить только для направления 3).

Как-то так. Довольно сложная комбинация IF-ов. Проще рекурсией.
Код:
procedure Paint(x,y:byte);
begin
 //с DrawGrid не работал, не знаю как он там внутри устроен, напишу для массива.
 a[x,y]:=Color2;
 
 if x<Nx-1 then
  if a[x+1,y] = color1 then 
   Paint(x+1,y);
 if x>0 then
  if a[x-1,y] = color1 then
   Paint(x-1,y);

 if y<Ny-1 then
  if a[x,y+1] = color1 then 
   Paint(x,y+1);
 if y>0 then
  if a[x,y-1] = color1 then
   Paint(x,y-1);
end;
По идеи так не должно слетать. Стек прогружается одним вызовом на 6 байт, для DrawGrid 20x20 максимум будет 2400 байт.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием