Ну, я бы тогда по твоему алгоритму сделал бы что-то типа:
Код:
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 с большим условием - что бы не вылететь за границу массива.