import java.util.TreeSet;

public class Prochazeni {

	// Setrideny seznam najitych vyhernich cest
	static TreeSet<Cesta> cesty = new TreeSet<Cesta>(); 
	
	// Procedura ktera projde vsechny cesty z daneho uzlu operaci po operaci
	static void prochazej(Cesta cesta){
		// Vezme posledni prvek z cesty
		Dzbany posledni=cesta.last();
		// A vyzkousi s nim udelat vsechny operace
		for (int i = 1; i <= 6; i++) {
			Dzbany dalsi=posledni.operace(i);
			// Pokud nedostane null (nesmyslna cesta)
			if (dalsi != null) {
				// Zkusi zda nema vyhravaci cestu
   				if (dalsi.vyhra()){
					cesta.add(dalsi);
					// pokud ma vyhravaci cestu, ulozi si ji do seznamu vyhravacich cest
					cesty.add(cesta.duplikat());
   					cesta.remove(dalsi);	
   				}
				else {
					// Pokud neni vyhravaci, zkontroluje nejsme ve stavu ktery uz na ceste je	
					if (!cesta.contains(dalsi)) {
						cesta.add(dalsi);
						// A pokud nejsme, zavola rekurzivne prochazeni na prodlouzenou cestu
						prochazej(cesta);
					}	
				}		
			}
		}
		// Tady jsme zkusili vsechny moznosti z dane cesty a odebereme tudiz posledni uz projity prvek
		cesta.remove(posledni);
	}
	
	
	// Metoda main ze ktere zavolame potrebne
	public static void main(String[] args) {

		int dzbanA,dzbanB,pozadavekC;
		System.out.println("Zadej velikost dzbanu A:");
		dzbanA=VstupData.ctiInt();
		System.out.println("Zadej velikost dzbanu B (mensi nez A):");
		dzbanB=VstupData.ctiInt();
		System.out.println("Zadej kolik vody chces odmerit do A (musi byt mensi nez A a nesmi se rovnat B:");
		pozadavekC=VstupData.ctiInt();
		// Zalozeni nove cesty vyhozim stavem s nastavenim A,B a C

		if (dzbanA <= dzbanB){
			System.out.println("Chybe zadana velikost dzbanu !");
			return;
		}
		
		if ((pozadavekC==dzbanB) || (pozadavekC>=dzbanA)){
			System.out.println("Chybe zadane mnozstvi vody na odmereni !");
			return;
		}
		
		Cesta cesta = new Cesta(dzbanA,dzbanB,pozadavekC);		

		// Projiti vsech moznosti a naplneni listu cest
		prochazej(cesta);

		// Pokud jsme nenasli zadnou cestu, zahlasime to
		if (cesty.isEmpty()){
			System.out.println("Neexistuje zadne reseni pro Vase zadani.");
		}
		// Jinak vypiseme serazene cesty
		else{
			System.out.println("Vyherni cesty serazene od nejkratsi:");
			for (Cesta c : cesty) {
				System.out.println(c);
			}
		}	
	}
}
