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); } }
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); }
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); } }