Решение данной задачи любезно предоставлено старшим преподавателем Одесской Национальной Пищевой Академии Попковым Д.Н.
Комментарии отделены //двойным слешем.
program Project1;
var
f1,f2:textfile;
m,n,i,j,k,l:integer;
a,b:array [0..100,0..100] of integer;
c:array [0..10000] of integer;//хранит площадь пятен под i-м номером
procedure qSort(l,r:longint); //сортировка
var i,j:longint;
w,q:integer;
begin
i := l; j := r;
q := c[(l+r) div 2];
repeat
while (c[i] < q) do inc(i);
while (q < c[j]) do dec(j);
if (i <= j) then
begin
w:=c[i]; c[i]:=c[j]; c[j]:=w;
inc(i); dec(j);
end;
until (i > j);
if (l < j) then qSort(l,j);
if (i < r) then qSort(i,r);
end;
begin
assign(f1,'OIL.DAT');
reset(f1);
assign(f2,'OIL.SOL');
rewrite(f2);
readln(f1, m, n);
k:=0;//хранит номер последнего определённого пятна
for i:=0 to m-1 do
for j:=0 to n-1 do
begin
read(f1, a[i,j]);
b[i,j]:=0; //массив b хранит 0 если область чиста, и номер пятна, если загрязнена
if a[i,j]=1 then //если область загрязнена, то проверяем ячейку слева, сверху и слева-сверх по диагонали
if ((i>0)and(b[i-1,j]<>0)) then //сверяем с ячейкой слева, загрязнена ли она чем-либо
begin
b[i,j]:=b[i-1,j];//если да, то ячейке присваиваем номер пятна в соседней ячейке
c[b[i,j]-1]:= c[b[i,j]-1]+1//увеличиваем площадь пятна с нужным номером(у индекса массива С отнимаем 1, так как нумерация массива идёт с 0, а пятен с 1)
end
else if((j>0)and(b[i,j-1]<>0)) then //сверху
begin
b[i,j]:=b[i,j-1];
c[b[i,j]-1]:= c[b[i,j]-1]+1
end
else if((i>0)and(j>0)and(b[i-1,j-1]<>0)) then //по диагонали
begin
b[i,j]:=b[i-1,j-1];
c[b[i,j]-1]:= c[b[i,j]-1]+1
end
else // если соседние ячейки чисты, то
begin
k:=k+1;//увеличиваем кол-во пятен
b[i,j]:=k;//присваеваем ячейке номер нового пянта
c[b[i,j]-1]:=1;//площадь нового пятна 1
end;
end;
writeln(f2, k); //выводим количество пятен
qsort(0,k-1); // сортируем массив с (по возрастанию площади)
i:=0;
while(i<=k-1) do //проходим по всему массиву с
begin
l:=1;// хранит кол-во пятен с одинаковой площадью
while ((c[i]=c[i+1])and(i<k-1)) do //если площадь этого пятна равна площади следующего то
begin
l:=l+1;
i:=i+1;
end;
writeln(f2, c[i], ' ', l);//выводим площадь пятна и кол-во таких пятен
i:=i+1;
end;
close(f1);
close(f2);
end.
Комментарии отделены //двойным слешем.
program Project1;
var
f1,f2:textfile;
m,n,i,j,k,l:integer;
a,b:array [0..100,0..100] of integer;
c:array [0..10000] of integer;//хранит площадь пятен под i-м номером
procedure qSort(l,r:longint); //сортировка
var i,j:longint;
w,q:integer;
begin
i := l; j := r;
q := c[(l+r) div 2];
repeat
while (c[i] < q) do inc(i);
while (q < c[j]) do dec(j);
if (i <= j) then
begin
w:=c[i]; c[i]:=c[j]; c[j]:=w;
inc(i); dec(j);
end;
until (i > j);
if (l < j) then qSort(l,j);
if (i < r) then qSort(i,r);
end;
begin
assign(f1,'OIL.DAT');
reset(f1);
assign(f2,'OIL.SOL');
rewrite(f2);
readln(f1, m, n);
k:=0;//хранит номер последнего определённого пятна
for i:=0 to m-1 do
for j:=0 to n-1 do
begin
read(f1, a[i,j]);
b[i,j]:=0; //массив b хранит 0 если область чиста, и номер пятна, если загрязнена
if a[i,j]=1 then //если область загрязнена, то проверяем ячейку слева, сверху и слева-сверх по диагонали
if ((i>0)and(b[i-1,j]<>0)) then //сверяем с ячейкой слева, загрязнена ли она чем-либо
begin
b[i,j]:=b[i-1,j];//если да, то ячейке присваиваем номер пятна в соседней ячейке
c[b[i,j]-1]:= c[b[i,j]-1]+1//увеличиваем площадь пятна с нужным номером(у индекса массива С отнимаем 1, так как нумерация массива идёт с 0, а пятен с 1)
end
else if((j>0)and(b[i,j-1]<>0)) then //сверху
begin
b[i,j]:=b[i,j-1];
c[b[i,j]-1]:= c[b[i,j]-1]+1
end
else if((i>0)and(j>0)and(b[i-1,j-1]<>0)) then //по диагонали
begin
b[i,j]:=b[i-1,j-1];
c[b[i,j]-1]:= c[b[i,j]-1]+1
end
else // если соседние ячейки чисты, то
begin
k:=k+1;//увеличиваем кол-во пятен
b[i,j]:=k;//присваеваем ячейке номер нового пянта
c[b[i,j]-1]:=1;//площадь нового пятна 1
end;
end;
writeln(f2, k); //выводим количество пятен
qsort(0,k-1); // сортируем массив с (по возрастанию площади)
i:=0;
while(i<=k-1) do //проходим по всему массиву с
begin
l:=1;// хранит кол-во пятен с одинаковой площадью
while ((c[i]=c[i+1])and(i<k-1)) do //если площадь этого пятна равна площади следующего то
begin
l:=l+1;
i:=i+1;
end;
writeln(f2, c[i], ' ', l);//выводим площадь пятна и кол-во таких пятен
i:=i+1;
end;
close(f1);
close(f2);
end.
Комментариев нет:
Отправить комментарий