Jakmile to bude šňůra třeba 80 svázaných políček,
tak stejně se ovšem výsledku nedočkáš. Pak bych sám rád našel odlišnej přístup.
Z hotového kódu nikdy nic pořádného nepobereš, převod do binární soustavy,
testování, nic víc na tom neni...
Doporučuji ti jestli to na tebe neni velké sousto zmohutnit skupiny na 8,10. 6 je
nakonec pro cache se mi zdá zbytečně málo.
Var
pole : array[1..58]of byte;
pole2 : array[1..12]of tpole;
delka : array[1..58]of byte;
vpoli:array[1..58] of integer;
maxima : array[1..58,1..58]of shortint;
{maxima jsou ty samotne cisla platne pro policka
mam je v jedne rade za sebou proto kazde maxima zasahuje do 3 / jedno cislo sikmonahoru,doprava,sikmodolu
}
pravd: array[1..58]of real;
zas : array[1..12]of t1;
pocet:integer;
{--------}
For i:=1 to n do
begin
For ii:=0 to 64 do begin
suma:=ii;
for j:=1 to delka[i] do begin pole2[i,j]:=0;
pole2[i,j]:=suma mod 2;
suma:=suma div 2;
end;
b:=0;
for j:=1 to n do begin
for a:=1 to delka[j] do pole[b+a]:=pole2[j,a];
b:=b+delka[j];
end;
test1:=true;
for j:=1 to l do begin
a:=1;
while (maxima[j,a]=-1)and(a<l) do inc(a);
suma:=0;
while maxima[j,a]<>-1 do
begin
suma:=suma+pole[a];
inc(a);
end;
If suma>maxima[j,a-1] then begin
{
TAHLE PODMINKA NENI VUBEC OPTIMALNI
U MAXIMA ktere je plne kryto v dane skupine je potreba testovat rovnost!
u okraju pak dejme tomu takhle
}
test1:=false; break; end;
suma:=0;
end;
If not test1 then continue;
zas[i].h[zas[i].uk]:=pole2[i];
inc(zas[i].uk);
end;
end;
To byla předpříprava
Repeat
For ii:=1 to n do begin
pole2[ii]:=zas[ii].h[vpoli[ii]];
end;
i:=1;
while vpoli[i]>=zas[i].uk do begin
vpoli[i]:=0;
inc(i);
inc(vpoli[i]);
end;
If i>n then break;
inc(vpoli[1]);
i:=0;
for j:=1 to n do begin
for a:=1 to delka[j] do pole[i+a]:=pole2[j,a];
i:=i+delka[j];
end;
test1:=true;
for j:=1 to 25 do
begin
a:=1;
while (maxima[j,a]=-1)and(a<l) do inc(a);
suma:=0;
while maxima[j,a]<>-1 do
begin
suma:=suma+pole[a];
inc(a);
end;
If suma<>maxima[j,a-1] then begin test1:=false; break; end;
suma:=0;
end;
If not test1 then continue;
for j:=1 to l do
If pole[j]=1 then
pravd[j]:=pravd[j]+1;
inc(pocet);
until false;
Tohle bylo samotné řešení výsledky jsou vysledek:=pravd[a]/pocet:4:2;
Spíš to ale pochopíš z tohohle základního
For i:=1 to 2 shl n do begin
suma:=i;
for j:=1 to n do begin pole[j]:=0;
pole[j]:=suma mod 2;
suma:=suma div 2;
end;
test1:=true;
for j:=1 to 3 do
begin
a:=1;
while maxima[j,a]=0 do inc(a);
suma:=0;
while maxima[j,a]<>0 do
begin
suma:=suma+pole[a];
inc(a);
end;
If suma<>maxima[j,a-1] then test1:=false;
end;
If not test1 then continue;
for j:=1 to n do
If pole[j]=1 then pravd[j]:=pravd[j]+1;
inc(pocet);
end;