public static void Main(String[] args) { Stav pocatek = nactiData(); tab = new Tabulka(maxobjem()); fronta = new Fronta(); sk = new SeznamStavu(tab, fronta); prelevani(pocatek); vypisVystup(); }
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); }
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); } }
public StavKroky(Stav stav, int kroky) { this.stav = stav; this.kroky = kroky; }
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); } }