Другие языки программирования и технологии

Помогите решить задачу по паскалю на двумерные массивы.

Дана матрица, заполненная 0 и 1. Нули - вода, единицы - суша. Острова - это как одиночные, так и группы клеток с единицами, окруженными со всех сторон нулями или краями матрицы. Две единицы образуют один остров, только если их клетки соприкасаются сторонами (не углами) . Написать программу, которая подсчитывает количество островов.



program dvumerni_massiv;




const

maxn = 100;

maxm = 100;




type

tarray = array[1..maxn, 1..maxm] of integer;




var

a: tarray;

n, i, k, j, m, g, h: integer;




procedure Init(var x: tarray; k, l: integer); // создаем массив, где только 0 и 1

var

n, m: integer;

i, j: integer;

begin

for i := 1 to k do

for j := 1 to l do

begin

a[i, j] := random(2);

end;

end;




procedure Print(x: tarray; k, l: integer); //печатаем массив

var

i, j: integer;

begin

for i := 1 to k do

begin

for j := 1 to l do

write(x[i, j]:5);

writeln;

end;



writeln;

end;




function rec(a: tarray;Var i, j: integer): integer; // пытался рекурсией добится нахождения островов, но пишет, что вышел за границы массива.. .

begin

if a[i, j + 1] = 1 then rec(a, i, j); //вот где проблема

if a[i + 1, j] = 1 then rec(a, i, j);

if a[i - 1, j] = 1 then rec(a, i, j);

if a[i, j - 1] = 1 then rec(a, i, j);

end;




begin

randomize;

readln(n, m);

init(a, n, m); //создаём массив

print(a, n, m); // печатаем массив

k := 0;

h := 0; //второстепенные переменные

g := 0;

for i := 1 to n do

for j := 1 to m do

begin //вот где проблема

rec(a, i, j); //попытка рекурсией

inc(g); //увеличение счетчика

end;



writeln(g);



end.
и какой только ерундой не займешься в воскресенье.. .
да и работать будет только на pascalabc...

uses
GraphABC;

type
TIslands = class
private
IslEt, IslTmp: array of array of integer;
IslReg: array of array of Color;
SizeX, SizeY: integer;

procedure DeleteIsland(x, y: integer; cl: color);

public
constructor Create();begin randomize end;

procedure GenerateNewIslandsMap(Size_X, Size_Y: integer);
function GetIslandsCount(): Integer;
procedure ShowIslands();

destructor Destroy();begin IslEt := nil; IslTmp := nil end;
end;

procedure TIslands.DeleteIsland(x, y: integer; cl: color);
begin
IslTmp[x, y] := 0;
IslReg[x, y] := cl;
if (x + 1 < SizeX) and (IslTmp[x + 1, y] = 1) then DeleteIsland(x + 1, y,cl);
if (x - 1 > -1) and (IslTmp[x - 1, y] = 1) then DeleteIsland(x - 1, y,cl);
if (y + 1 < SizeY) and (IslTmp[x, y + 1] = 1) then DeleteIsland(x, y + 1,cl);
if (y - 1 > -1) and (IslTmp[x, y - 1] = 1) then DeleteIsland(x, y - 1,cl);
end;

procedure TIslands.GenerateNewIslandsMap(Size_X, Size_Y: integer);
var
x, y: integer;
begin
SizeX := Size_X;
SizeY := Size_Y;
SetLength(IslEt, SizeX);
SetLength(IslTmp, SizeX);
SetLength(IslReg, SizeX);
for x := 0 to SizeX - 1 do
begin
SetLength(IslEt[x], SizeY);
SetLength(IslReg[x], SizeY);
for y := 0 to SizeY - 1 do
begin
IslEt[x, y] := random(2);
IslReg[x, y] := clLightGray;
end;
IslTmp[x] := copy(IslEt[x]);
end;
end;

function TIslands.GetIslandsCount(): Integer;
var
x, y, count: integer;
begin
for x := 0 to SizeX - 1 do
for y := 0 to SizeY - 1 do
if IslTmp[x, y] = 1 then
begin
DeleteIsland(x, y, clrandom);
inc(count);
end;
result := count;
end;

procedure TIslands.ShowIslands();
var
x, y: integer;
begin
for y := 0 to SizeY - 1 do
begin
for x := 0 to SizeX - 1 do
begin
Font.Color := IslReg[x, y];
write(IslEt[x, y],' ');
end;
writeln;
end;
end;

var
Islands: TIslands;
x,y:integer;

begin
Font.Size := 14;
Font.Style := fsBold;
Islands := TIslands.Create;
write('Укажите размер карты по оси X:'); readln(x); writeln(x);
write('Укажите размер карты по оси Y:'); readln(y); writeln(y);
Islands.GenerateNewIslandsMap(x, y);
writeln('Количество островов: ', Islands.GetIslandsCount());
writeln;
Islands.ShowIslands();
Islands.Destroy;
end.
БР
Бахыт Рахманов
3 147
Лучший ответ
вопрос в латинице. программа в кириллице.

текст конвертирован самодельной программой.

------------------------------------------
DANA MATRICA, ZAPOLNENNAJ 0 I 1. NULI - VODA, EDINICY - SUSA. OSTROVA - ATO KAK ODINOCNYE, TAK I GRUPPY KLETOK S EDINICAMI, OKRUJENNYMI SO VSEH STORON NULJMI ILI KRAJMI MATRICY. DVE EDINICY OBRAZUUT ODIN OSTROV, TOL'KO ESLI IH KLETKI SOPRIKASAUTSJ STORONAMI (NE UGLAMI) . NAPISAT' PROGRAMMU, KOTORAJ PODSCITYVAET KOLICESTVO OSTROVOV.

ПРОГРАМ ДВУМЕРНИ_МАССИВ;
ЦОНСТ
МАКН = 100;
МАКМ = 100;
ТЫПЕ
ТАРРАЫ = АРРАЫ [1..МАКН, 1..МАКМ] ОФ ИНТЕГЕР;
ВАР
А: ТАРРАЫ;
Н, И, К, Ж, М, Г, Х: ИНТЕГЕР;
ПРОЦЕДУРЕ ИНИТ (ВАР К: ТАРРАЫ; К, Л: ИНТЕГЕР) ; // создаем массив, где только 0 и 1
ВАР
Н, М: ИНТЕГЕР;
И, Ж: ИНТЕГЕР;
БЕГИН
ФОР И := 1 ТО К ДО
ФОР Ж := 1 ТО Л ДО
БЕГИН
А [И, Ж] := РАНДОМ (2);
ЕНД;
ЕНД;

ПРОЦЕДУРЕ ПРИНТ (К: ТАРРАЫ; К, Л: ИНТЕГЕР) ; //печатаем массив
ВАР
И, Ж: ИНТЕГЕР;
БЕГИН
ФОР И := 1 ТО К ДО
БЕГИН
ФОР Ж := 1 ТО Л ДО
ВРИТЕ (К [И, Ж]: 5);
ВРИТЕЛН;
ЕНД;
ВРИТЕЛН;
ЕНД;

ФУНЦТИОН РЕЦ (А: ТАРРАЫ; ВАР И, Ж: ИНТЕГЕР) : ИНТЕГЕР; // пытался рекурсией добится нахождения островов, но пишет, что вышел за границы массива. . .
БЕГИН
ИФ А [И, Ж + 1] = 1 ТХЕН РЕЦ (А, И, Ж) ; //вот где проблема
ИФ А [И + 1, Ж] = 1 ТХЕН РЕЦ (А, И, Ж) ;
ИФ А [И - 1, Ж] = 1 ТХЕН РЕЦ (А, И, Ж) ;
ИФ А [И, Ж - 1] = 1 ТХЕН РЕЦ (А, И, Ж) ;
ЕНД;

БЕГИН
РАНДОМИЗЕ;
РЕАДЛН (Н, М) ;
ИНИТ (А, Н, М) ; //создаём массив
ПРИНТ (А, Н, М) ; // печатаем массив
К := 0;
Х := 0; //второстепенные переменные
Г := 0;
ФОР И := 1 ТО Н ДО
ФОР Ж := 1 ТО М ДО
БЕГИН //вот где проблема
РЕЦ (А, И, Ж) ; //попытка рекурсией
ИНЦ (Г) ; //увеличение счетчика
ЕНД;
ВРИТЕЛН (Г) ;
ЕНД.
Степан Тырышкин так в чём у меня ошибка