Показать сообщение отдельно
  #2  
Старый 29.07.2015, 19:45
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, я бы тогда по твоему алгоритму сделал бы что-то типа:
Код:
var
  A : Array Of Integer; // Карта

// "Удаление" острова
procedure DeleteIsland(AI, AJ : Integer);
var
  I, J : Integer;
begin
  A[I,J] := 0;
  For I := AI-1 To AI+1 Do
    For J := AJ-1 To AJ+1 Do
      If (I >= Low(A)) And (I <= High(A)) And (J >= Low(A[i])) And (J <= High(A[i])) Then
        If A[I,J] = 1 Then DeleteIsland(I,J);
end;

// Подсчет островов
function CountIslands : Integer;
var
  I, J : Integer;
begin
  Result := 0;
  For I := Low(A) To High(A) Do
    For J := Low(A[i]) To High(A[i]) Do
      If A[I,J] = 1 Then
        Begin
          Inc(Result);
          DeleteIsland(I,J);
        End;
end;

Кратко:
CountIslands - пробегает по всем ячейкам матрицы и если находит 1, то увеличивает счетчик и вызывает процедуру удаления острова.
DeleteIsland - удаляет элемент острова в текущей ячейке, а потом рекурсивно вызывает себя для удалени всех соседних ячеек (если они равны 1). If с большим условием - что бы не вылететь за границу массива.
Ответить с цитированием