//ako je čvor proširiv, zove metodu stvoriCvor, koja stvara dijete trenutnog čvora public static void prosiriCvor(Cvor trenutniCvor) { for (int stapSkini = 0; stapSkini < 3; stapSkini++) { for (int stapStavi = 0; stapStavi < 3; stapStavi++) { if (stapStavi != stapSkini) { Cvor noviCvor = stvoriCvor(trenutniCvor, stapSkini, stapStavi); if (noviCvor != null) { if (!posjeceniSadrze(noviCvor)) { if (Tornjevi.odabirAlgoritma == 1) { Tornjevi.otvoreniCvorovi.Add(noviCvor); } else if (Tornjevi.odabirAlgoritma == 2) { Tornjevi.otvoreniCvorovi.Insert(0, noviCvor); } } } } } } }
static void Main() //static void Main(string[] args) { Tornjevi.brojacIdentifikacijskogBroja = 1; odaberiBrojDiskova(); odaberiAlgoritam(); Cvor pocetniCvor = stvoriPocetniCvor(); Cvor ciljniCvor = stvoriCiljniCvor(); Tornjevi.otvoreniCvorovi.Add(pocetniCvor); Cvor trenutniCvor = new Cvor(); while (true) { trenutniCvor = Tornjevi.otvoreniCvorovi[0]; Tornjevi.otvoreniCvorovi.Remove(trenutniCvor); Tornjevi.posjeceniCvorovi.Add(trenutniCvor); if (trenutniCvor.jednak(ciljniCvor)) { break; } prosiriCvor(trenutniCvor); } napuniListuZaCrtanje(trenutniCvor); for (int redniBroj = 0; redniBroj < Tornjevi.ListaZaCrtati.Count; redniBroj++) { Cvor.crtajCvor(Tornjevi.ListaZaCrtati[redniBroj]); } }
//metoda vraća true ako je stanje već bilo obrađeno, inače false public static bool posjeceniSadrze(Cvor trenutniCvor) { for (int redniBroj = 0; redniBroj < Tornjevi.posjeceniCvorovi.Count; redniBroj++) { if (trenutniCvor.jednak(Tornjevi.posjeceniCvorovi[redniBroj])) { return(true); } } return(false); }
//inicijalizira ciljni čvor public static Cvor stvoriCiljniCvor() { Cvor ciljniCvor = new Cvor(); ciljniCvor.identifikacijskiBroj = 0; for (int pozicijaNaStapu = 0; pozicijaNaStapu < Tornjevi.brojDiskova; pozicijaNaStapu++) { ciljniCvor.naStapuDisk[2][pozicijaNaStapu] = 1; } return(ciljniCvor); }
//inicijalizira početni čvor public static Cvor stvoriPocetniCvor() { Cvor pocetniCvor = new Cvor(); pocetniCvor.identifikacijskiBroj = Tornjevi.brojacIdentifikacijskogBroja; Tornjevi.brojacIdentifikacijskogBroja++; for (int pozicijaNaStapu = 0; pozicijaNaStapu < Tornjevi.brojDiskova; pozicijaNaStapu++) { pocetniCvor.naStapuDisk[0][pozicijaNaStapu] = 1; } return(pocetniCvor); }
//uspoređuje čvorove, vraća false ako nisu jednaki, inače true public bool jednak(Cvor trenutniCvor) { for (int brojStapa = 0; brojStapa < 3; brojStapa++) { for (int brojDiska = 0; brojDiska < Tornjevi.brojDiskova; brojDiska++) { if (this.naStapuDisk[brojStapa][brojDiska] != trenutniCvor.naStapuDisk[brojStapa][brojDiska]) { return(false); } } } return(true); }
//iscrtavanje cvora na ekran public static void crtajCvor(Cvor trenutniCvor) { for (int brojStapa = 1; brojStapa <= 3; brojStapa++) { Console.Write("\n" + brojStapa + ". stap I-"); for (int brojDiska = Tornjevi.brojDiskova; brojDiska > 0; brojDiska--) { if (trenutniCvor.naStapuDisk[brojStapa - 1][brojDiska - 1] == 1) { Console.Write(brojDiska); } } Console.WriteLine("\n\n"); } // Console.WriteLine("\n"); }
public static Cvor stvoriCvor(Cvor trenutniCvor, int stapSkini, int stapStavi) { bool stvoriIsOK = false; int najmanjiDisk = 0; while (najmanjiDisk < Tornjevi.brojDiskova) { if (trenutniCvor.naStapuDisk[stapSkini][najmanjiDisk] == 1) { stvoriIsOK = true; break; } if (trenutniCvor.naStapuDisk[stapStavi][najmanjiDisk] == 1) { break; } najmanjiDisk++; } //ako je moguće stvoriti novi čvor, stvara ga if (stvoriIsOK) { Cvor noviCvor = new Cvor(); //kopiramo trenutni čvor u novi for (int brojStapa = 0; brojStapa < 3; brojStapa++) { for (int pozicijaNaStapu = 0; pozicijaNaStapu < Tornjevi.brojDiskova; pozicijaNaStapu++) { noviCvor.naStapuDisk[brojStapa][pozicijaNaStapu] = trenutniCvor.naStapuDisk[brojStapa][pozicijaNaStapu]; } } //mijenjamo potrebne podatke noviCvor.naStapuDisk[stapSkini][najmanjiDisk] = 0; noviCvor.naStapuDisk[stapStavi][najmanjiDisk] = 1; noviCvor.identifikacijskiBroj = Tornjevi.brojacIdentifikacijskogBroja; Tornjevi.brojacIdentifikacijskogBroja++; noviCvor.identifikacijskiBrojRoditelja = trenutniCvor.identifikacijskiBroj; return(noviCvor); } return(null); }
//rekurzivno u listu za crtanje stavlja čvorove public static void napuniListuZaCrtanje(Cvor trenutniCvor) { Tornjevi.ListaZaCrtati.Insert(0, trenutniCvor); // Cvor noviCvor = new Cvor(); for (int redniBroj = 0; redniBroj < Tornjevi.posjeceniCvorovi.Count; redniBroj++) { if (trenutniCvor.identifikacijskiBrojRoditelja == Tornjevi.posjeceniCvorovi[redniBroj].identifikacijskiBroj) { trenutniCvor = Tornjevi.posjeceniCvorovi[redniBroj]; break; } } if (trenutniCvor.identifikacijskiBroj == 1) { Tornjevi.ListaZaCrtati.Insert(0, trenutniCvor); } else { napuniListuZaCrtanje(trenutniCvor); } }