Program S_radosti_prijmi_svuj_osud; Const Lahvi=3; Type THladiny= Array [1..Lahvi] of Byte; Const Objem: THladiny=(2,5,11); KonecnyObjem=4; DelkaFronty=10000; Var Hladina,ZalozniHladina: THladiny; Neni: Array [0..10000] of Boolean; Predchozi: Array[0..10000] of Word; Fronta: Array[0..DelkaFronty-1] of Byte; Zacatek,Konec: Word; Hotovo: Boolean; i,j: Word; Procedure Prelej(Odkud,Kam: Byte); Begin If Odkud=0 then {Dolevam ze sudu} Hladina[Kam]:=Objem[Kam] {Lahev se uplne naplni} else If Kam=0 then {Vylevam do sudu} Hladina[Odkud]:=0 {Lahev se uplne vyprazdni} else If Hladina[Odkud]+Hladina[Kam]<=Objem[Kam] then Begin {Vsechno se preleje do lahve} Hladina[Kam]:=Hladina[Kam]+Hladina[Odkud]; Hladina[Odkud]:=0; End else Begin {V prvni lahvi jeste neco zbyde} Hladina[Odkud]:=Hladina[Odkud]+Hladina[Kam]-Objem[Kam]; Hladina[Kam]:=Objem[Kam]; End; End; Procedure Koduj(Hladina: THladiny; Var Kod: Word); Var i: Byte; Begin Kod:=0; For i:=1 to Lahvi do Begin {Ted objemy jednoznacne zakoduji} Kod:=Kod*(Objem[i]+1); Kod:=Kod+Hladina[i]; if Hladina[i]=KonecnyObjem then Hotovo:=True; {Nasel jsem reseni} End; End; Procedure ZaradDoFronty; Var Kod,Kod2: Word; Begin Koduj(Hladina,Kod); If Neni[Kod] then Begin {Pokud jsem tu uz nebyl} Neni[Kod]:=False; Fronta[Konec]:=Kod; Konec:=(Konec+1) mod DelkaFronty; Koduj(ZalozniHladina,Kod2); Predchozi[Kod]:=Kod2; End; End; Procedure Dekoduj(Kod: Word; Var Hladina:THladiny); Var i: Byte; Begin For i:=Lahvi downto 1 do Begin Hladina[i]:=Kod mod (Objem[i]+1); Kod:=Kod div (Objem[i]+1); End; End; Procedure VyndejZFronty; Var Kod: Word; Begin Kod:=Fronta[Zacatek]; Zacatek:=(Zacatek+1) mod DelkaFronty; Dekoduj(Kod,Hladina); End; Begin Hotovo:=False; For i:=0 to 10000 do Neni[i]:=True; Predchozi[0]:=0; Zacatek:=0; Konec:=0; For i:=1 to Lahvi do Hladina[Lahvi]:=0; ZaradDoFronty; Repeat VyndejZFronty; ZalozniHladina:=Hladina; i:=0; Repeat j:=0; Repeat If i<>j then Begin {Zkousim prelit z kazde lahve do kazde} Prelej(i,j); ZaradDoFronty; if not Hotovo then Hladina:=ZalozniHladina; End; inc(j); until Hotovo or (j>Lahvi); inc(i); until Hotovo or (i>Lahvi); until Hotovo or (Zacatek=Konec); Repeat For i:=1 to Lahvi do Write(Hladina[i],' '); Writeln; Koduj(Hladina,j); Dekoduj(Predchozi[j],Hladina); until Predchozi[j]=0; End.