예제 #1
0
        public void umim(Stav stav, int kroky)
        {
            bool aktualizace = false;

            //byl jsem j*z v danem stavu?
            if (seznamStavu.ContainsKey(stav))
            {
                int umimKroky;
                //za kolik kroku
                seznamStavu.TryGetValue(stav, out umimKroky);
                if (umimKroky > kroky)
                {
                    //umim to lepe - aktualizace
                    seznamStavu.Remove(stav);
                    seznamStavu.Add(stav, kroky);
                    aktualizace = true;
                }
            }
            else
            {
                //v danem stavu jsem nebyl, poznamenam si, za kolik kroku jej umim
                seznamStavu.Add(stav, kroky);
                StavKroky sk = new StavKroky(stav, kroky);
                fronta.pridej(sk);
                aktualizace = true;
            }

            if (aktualizace)
            {
                //vlozit do tabulky, za kolik umim dane hodnoty
                tabulka.vloz(stav.getA(), kroky);
                tabulka.vloz(stav.getB(), kroky);
                tabulka.vloz(stav.getC(), kroky);
            }
        }
예제 #2
0
        public override int GetHashCode()
        {
            //chci rad objemu (1, 10, 100, ....)
            int m = 1; int desetNaM = 10;
            int maxObjem = Ovladac.maxobjem();

            while ((desetNaM * 10) > maxObjem)
            {
                desetNaM *= 10;
                m++;
            }
            m++;
            return(kroky + stav.getA() * m + stav.getB() * m * m + stav.getC() * m * m * m);
        }
예제 #3
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);
            }
        }