Exemplo n.º 1
0
        public static void Main(String[] args)
        {
            Stav pocatek = nactiData();

            tab    = new Tabulka(maxobjem());
            fronta = new Fronta();
            sk     = new SeznamStavu(tab, fronta);
            prelevani(pocatek);
            vypisVystup();
        }
Exemplo n.º 2
0
 static void prelevej(Stav stav, int krok)
 {
     //prelit z A do B
     prelej(stav, Nadoba.A, Nadoba.B, krok);
     //prelit z A do C
     prelej(stav, Nadoba.A, Nadoba.C, krok);
     //prelit z B do A
     prelej(stav, Nadoba.B, Nadoba.A, krok);
     //prelit z B do C
     prelej(stav, Nadoba.B, Nadoba.C, krok);
     //prelit z C do A
     prelej(stav, Nadoba.C, Nadoba.A, krok);
     //prelit z C do B
     prelej(stav, Nadoba.C, Nadoba.B, krok);
 }
Exemplo n.º 3
0
 static void prelevani(Stav vychozi)
 {
     //init: umim vychozi stav na 0 kroku
     sk.umim(vychozi, 0);
     //vlozim do fronty stavy, do kterych se dostanu z vychoziho stavu
     prelevej(vychozi, 1);
     //dokud neni fronta prazdna, tak vezmu stav z fronty a budu prelevat
     while (!fronta.jePrazdna())
     {
         StavKroky stakr    = fronta.odeber();
         Stav      aktualni = stakr.getStav();
         int       krok     = stakr.getKroky() + 1;
         prelevej(aktualni, krok);
     }
 }
Exemplo n.º 4
0
 public StavKroky(Stav stav, int kroky)
 {
     this.stav  = stav;
     this.kroky = kroky;
 }
Exemplo n.º 5
0
        static void prelej(Stav stav, Nadoba odkud, Nadoba kam, int krok)
        {
            if (stav.getObsah(odkud) != 0)
            {
                //je co prelevat
                Stav novy;
                int  volno = getObjem(kam) - stav.getObsah(kam);                    //kolik mam v cilove nadobe k dispozici objemu
                int  new_a = stav.getA(), new_b = stav.getB(), new_c = stav.getC(); //konecny stav, na zacatku ekvivalentni vychozimu stavu

                int noveOdkud, noveKam;
                //v nadobe odkud leju je vice vody nez je volny objem cilove nadoby
                if (stav.getObsah(odkud) >= volno)
                {
                    noveOdkud = stav.getObsah(odkud) - volno;
                    noveKam   = getObjem(kam);
                }
                //obsah nadoby odkud liji se vejde do cilove nadoby
                else
                {
                    noveOdkud = 0;
                    noveKam   = stav.getObsah(kam) + stav.getObsah(odkud);
                    if (noveKam > getObjem(kam))
                    {
                        throw new Exception("ERROR: Pretekla nadoba " + kam + " (objem: " + getObjem(kam) + " novy obsah: " + noveKam);
                    }
                }

                //nastavim parametry ciloveho stavu
                switch (odkud)
                {
                case Nadoba.A:
                    new_a = noveOdkud;
                    break;

                case Nadoba.B:
                    new_b = noveOdkud;
                    break;

                case Nadoba.C:
                    new_c = noveOdkud;
                    break;
                }

                switch (kam)
                {
                case Nadoba.A:
                    new_a = noveKam;
                    break;

                case Nadoba.B:
                    new_b = noveKam;
                    break;

                case Nadoba.C:
                    new_c = noveKam;
                    break;
                }

                if ((new_a + new_b + new_c) != Ovladac.getSum())
                {
                    throw new Exception("FATAL ERROR: Ztratila se voda! A:" + new_a + " " + " B:" + new_b + " C:" + new_c + " Odkud: " + odkud + " Kam: " + kam + " Obsah odkud: " + stav.getObsah(odkud) + " Volno: " + volno);
                }
                //vytvorim cilovy stav
                novy = new Stav(new_a, new_b, new_c);
                //oznamim, ze jsem se dostal do daneho stavu
                sk.umim(novy, krok);
            }
        }