Задача про найменше покриття (Delphi)
Доброго дня!
Суть проблеми полягає в тому, що є вже готовий додаток і мені потрібно просто розібратись в коді, а саме з тим фрагментом, де відбувається пошук мінімального покриття.
Порібно написати зрозумілі коментарі (що де куди і як робиться), а потім на основі них побудувати блок-схему алгоритму. Вдячна всім, хто хоч якось спробує допомогти!
Код:
//Процедура пошуку найменшого покриття
procedure TMainForm.N6Click(Sender: TObject);
var outp:tchildform;
i,j,k,jj,SumElem,MaxSum,r,mm,pp:integer;
E:array of byte;
sn:string;
o,kp:byte;
zz,z:real;
var bit:tbitmap;
label l1,l2;
begin
//Визначення наявності покриттів
SumElem:=0;
for j:=0 to n-1 do begin
for i:=0 to m-1 do
SumElem:=SumElem+DataTab[i,j];
if SumElem=0 then begin ShowMessage('Для '+ActiveMDichild.caption+' покриттів не існує.');
exit; end;
SumElem:=0;
end;
//Визначення розмірів масивів P і C
SumElem:=0; MaxSum:=0;
for i:=0 to m-1 do begin
for j:=0 to n-1 do SumElem:=SumElem+DataTab[i,j];
if MaxSum<SumElem then MaxSum:=SumElem;
SumElem:=0;
end;
setlength(C,n,MaxSum);
setlength(P,n,MaxSum,n);
//Формування блоків таблиці
i:=0;j:=0;
repeat
k:=0;
repeat
if datatab[i,j]=1 then
begin
jj:=0;
setlength(C[j],k+1);
c[j][k]:=ves[i];
setlength(P[j],k+1,n);
repeat
p[j][k,jj]:=datatab[i,jj];
jj:=jj+1;
until jj>n-1;
k:=k+1;
end;
i:=i+1;
until i>m-1;
j:=j+1;
i:=0;
until j>n-1;
KDataTab:=DataTab;
KVes:=Ves;
//Пошук
setlength(E,n);kp:=1;
for i:=0 to n-1 do E[i]:=0;
k:=0;z:=0;zz:=1.7*power(10,38);B:=nil;
i:=0;
while i<=n-1 do
begin
if E[i]=0 then
begin
j:=-1;
l2:repeat
j:=j+1;
if j>high(P[i]) then goto l1;
until z+c[i,j]<=zz;
K:=k+1;setlength(B,k);
z:=z+c[i,j];B[k-1,0]:=i;
B[k-1,1]:=j;
for r:=i to n-1 do
if p[i][j,r]=1 then E[r]:=1;
end;
i:=i+1;
end;
//Видаляємо в лістингу
if zz=z then kp:=kp+1;
zz:=z;BB:=B;
l1: if B=nil then begin
//Виведення результату
i:=activemdichild.Top;
j:=activemdichild.Width;
jj:=activemdichild.left;
mainform.opendialog1.Tag:=1;
outp:=tchildform.Create(application);
showwindow(outp.Handle,sw_hide);
outp.top:=i;outp.left:=j+jj;
if Ntab=0 then Ntab:=1;
outp.Caption:='Покриття '+inttostr(Ntab);
outp.StringGrid1.colcount:=high(BB)+2;
outp.StringGrid1.rowcount:=n+2;
outp.width:=(high(BB)+3)*40;
outp.height:=(n+4)*24;
{Звернути увагу!}
StatusBar1.Panels.Items[0].Text:='Знайдено покриттів:'+inttostr(kp);
StatusBar1.Panels.Items[1].Text:='Найменша вага:'+floattostr(zz);
for i:=0 to high(BB) do
for j:=0 to n-1 do
outp.StringGrid1.cells[i+1,j+1]:=inttostr(p[bb[i,0]][bb[i,1],j]);
for i:=0 to high(BB) do outp.StringGrid1.cells[i+1,n+1]:=floattostr(c[bb[i,0]][bb[i,1]]);
for i:=1 to high(BB)+1 do
for jj:=0 to high(kves) do
if outp.StringGrid1.cells[i,n+1]=floattostr(kves[jj]) then begin
o:=0;
for j:=0 to n-1 do
if outp.StringGrid1.cells[i,j+1]=inttostr(kDatatab[jj,j])
then o:=o+1;
if o=n then outp.StringGrid1.Cells[i,0]:='M'+inttostr(jj+1);
end;
N6.Enabled:=false;
toolbutton5.Enabled:=false;
|