From 3f17bcf9a9707819b583e7940611c49185011ae7 Mon Sep 17 00:00:00 2001 From: Ivan Pribela Date: Fri, 8 Dec 2017 21:06:43 +0100 Subject: [PATCH] Lavirint, objedinjeno resenje, doterane praznine i formatiranja --- .../SuperKomplikovanoResenje/Lavirint.java | 256 +++++++++--------- .../LavirintProgram.java | 109 ++++---- .../SuperKomplikovanoResenje/Mapa.java | 157 ++++++----- .../SuperKomplikovanoResenje/Polje.java | 36 +-- .../SuperKomplikovanoResenje/Put.java | 174 ++++++------ 5 files changed, 365 insertions(+), 367 deletions(-) diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Lavirint.java b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Lavirint.java index 7f18f3f..3947b39 100644 --- a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Lavirint.java +++ b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Lavirint.java @@ -8,149 +8,149 @@ import java.util.Comparator; */ public class Lavirint { - // Polje m sadrzi kompletnu mapu - private Mapa m; + // Polje m sadrzi kompletnu mapu + private Mapa m; - // Polje optResenje sluzi za pamcenje optimalnog resenja - private Put optResenje; + // Polje optResenje sluzi za pamcenje optimalnog resenja + private Put optResenje; - // Ucitava mapu iz datog fajla i stampa je na ekran - public Lavirint(String imeFajla) { - m = new Mapa(imeFajla); - m.stampaj(); - } + // Ucitava mapu iz datog fajla i stampa je na ekran + public Lavirint(String imeFajla) { + m = new Mapa(imeFajla); + m.stampaj(); + } - // Provarava da li postoji put do izlaza i vraca vrednost true - // ako postoji put ili vrednost false ako ne postoji - public boolean postojiPut(int x, int y) { - if (x < 0 || x >= m.getSirina() || y < 0 || y >= m.getVisina()) { - return false; - } - if (m.getPos(x, y) == true) { - return false; - } - if (m.getMat(x, y) == Mapa.ZID) { - return false; - } - if (m.getMat(x, y) == Mapa.IZLAZ) { - return true; - } - m.setPos(x, y, true); - if (postojiPut(x + 1, y)) { - return true; - } - if (postojiPut(x - 1, y)) { - return true; - } - if (postojiPut(x, y + 1)) { - return true; - } - if (postojiPut(x, y - 1)) { - return true; - } - m.setPos(x, y, false); - return false; - } + // Provarava da li postoji put do izlaza i vraca vrednost true + // ako postoji put ili vrednost false ako ne postoji + public boolean postojiPut(int x, int y) { + if (x < 0 || x >= m.getSirina() || y < 0 || y >= m.getVisina()) { + return false; + } + if (m.getPos(x, y) == true) { + return false; + } + if (m.getMat(x, y) == Mapa.ZID) { + return false; + } + if (m.getMat(x, y) == Mapa.IZLAZ) { + return true; + } + m.setPos(x, y, true); + if (postojiPut(x + 1, y)) { + return true; + } + if (postojiPut(x - 1, y)) { + return true; + } + if (postojiPut(x, y + 1)) { + return true; + } + if (postojiPut(x, y - 1)) { + return true; + } + m.setPos(x, y, false); + return false; + } - // Poziva metodu rput da pronadje i ispise put, ako postoji - // Ukoliko put ne postoji, ispisuje poruku o gresci - public void nadjiPut(int x, int y) { - if (!rput(x, y)) { - System.err.println("Ne postoji put"); - } - } + // Poziva metodu rput da pronadje i ispise put, ako postoji + // Ukoliko put ne postoji, ispisuje poruku o gresci + public void nadjiPut(int x, int y) { + if (!rput(x, y)) { + System.err.println("Ne postoji put"); + } + } - // Proverava da li postoji put korsiteci pretrazivanje sa vracanjem - // Ukoliko se pronadje izlaz iz lavirinta, stampa se put u obrnutom - // redosledu - // Put se stampa pri povratku iz rekurzije - private boolean rput(int x, int y) { - if (x < 0 || x >= m.getSirina() || y < 0 || y >= m.getVisina()) { - return false; - } - if (m.getPos(x, y)) { - return false; - } - if (m.getMat(x, y) == Mapa.ZID) { - return false; - } - if (m.getMat(x, y) == Mapa.IZLAZ) { - System.out.println(x + " " + y); - return true; - } - m.setPos(x, y, true); - if (rput(x + 1, y) || rput(x, y + 1) || rput(x, y - 1) - || rput(x - 1, y)) { - System.out.println(x + " " + y); - return true; - } - m.setPos(x, y, false); - return false; - } + // Proverava da li postoji put korsiteci pretrazivanje sa vracanjem + // Ukoliko se pronadje izlaz iz lavirinta, stampa se put u obrnutom + // redosledu + // Put se stampa pri povratku iz rekurzije + private boolean rput(int x, int y) { + if (x < 0 || x >= m.getSirina() || y < 0 || y >= m.getVisina()) { + return false; + } + if (m.getPos(x, y)) { + return false; + } + if (m.getMat(x, y) == Mapa.ZID) { + return false; + } + if (m.getMat(x, y) == Mapa.IZLAZ) { + System.out.println(x + " " + y); + return true; + } + m.setPos(x, y, true); + if (rput(x + 1, y) || rput(x, y + 1) || rput(x, y - 1) + || rput(x - 1, y)) { + System.out.println(x + " " + y); + return true; + } + m.setPos(x, y, false); + return false; + } - // Kreira optimalno resenje za put, pri cemu se za optimalnost resenja - // koristi komparator po duzini resenja, tj. trazi se najkrace resenje - // Samo resenje kreira se u metodi optPut - public Put najkraciPut(int x, int y) { - Put r = new Put(); - optPut(x, y, r, new KomparatorPoDuzini()); - return optResenje; - } + // Kreira optimalno resenje za put, pri cemu se za optimalnost resenja + // koristi komparator po duzini resenja, tj. trazi se najkrace resenje + // Samo resenje kreira se u metodi optPut + public Put najkraciPut(int x, int y) { + Put r = new Put(); + optPut(x, y, r, new KomparatorPoDuzini()); + return optResenje; + } - // Kreira optimalno resenje za put, pri cemu se za optimalnost resenja - // koristi komparator po duzini resenja, tj. trazi se najvrednije resenje - // Samo resenje kreira se u metodi optPut - public Put najvrednijiPut(int x, int y) { - Put trenutni = new Put(); - optPut(x, y, trenutni, new KomparatorPoVredosti()); - return optResenje; - } + // Kreira optimalno resenje za put, pri cemu se za optimalnost resenja + // koristi komparator po duzini resenja, tj. trazi se najvrednije resenje + // Samo resenje kreira se u metodi optPut + public Put najvrednijiPut(int x, int y) { + Put trenutni = new Put(); + optPut(x, y, trenutni, new KomparatorPoVredosti()); + return optResenje; + } - // Proverava da li postoji put korsiteci pretrazivanje sa vracanjem - // Ukoliko se pronadje na prvi ili optimalniji put, taj put se pamti u - // optResenje - // Optimalnost puta se proverava komparatorom - private void optPut(int x, int y, Put trenutni, Comparator c) { - if (x < 0 || x >= m.getSirina() || y < 0 || y >= m.getVisina()) { - return; - } - if (m.getPos(x, y)) { - return; - } - if (m.getMat(x, y) == Mapa.ZID) { - return; - } - if (m.getMat(x, y) == Mapa.IZLAZ) { - trenutni.dodaj(x, y, 0); - if (optResenje == null || c.compare(trenutni, optResenje) < 0) { - optResenje = new Put(trenutni); - } - trenutni.izbaciKraj(); - return; - } + // Proverava da li postoji put korsiteci pretrazivanje sa vracanjem + // Ukoliko se pronadje na prvi ili optimalniji put, taj put se pamti u + // optResenje + // Optimalnost puta se proverava komparatorom + private void optPut(int x, int y, Put trenutni, Comparator c) { + if (x < 0 || x >= m.getSirina() || y < 0 || y >= m.getVisina()) { + return; + } + if (m.getPos(x, y)) { + return; + } + if (m.getMat(x, y) == Mapa.ZID) { + return; + } + if (m.getMat(x, y) == Mapa.IZLAZ) { + trenutni.dodaj(x, y, 0); + if (optResenje == null || c.compare(trenutni, optResenje) < 0) { + optResenje = new Put(trenutni); + } + trenutni.izbaciKraj(); + return; + } - // pokusavamo da trazimo dalje put - m.setPos(x, y, true); - trenutni.dodaj(x, y, m.getMat(x, y)); - optPut(x + 1, y, trenutni, c); - optPut(x, y + 1, trenutni, c); - optPut(x, y - 1, trenutni, c); - optPut(x - 1, y, trenutni, c); - m.setPos(x, y, false); - trenutni.izbaciKraj(); - } + // pokusavamo da trazimo dalje put + m.setPos(x, y, true); + trenutni.dodaj(x, y, m.getMat(x, y)); + optPut(x + 1, y, trenutni, c); + optPut(x, y + 1, trenutni, c); + optPut(x, y - 1, trenutni, c); + optPut(x - 1, y, trenutni, c); + m.setPos(x, y, false); + trenutni.izbaciKraj(); + } } // Komparator za puteve po duzini resenja class KomparatorPoDuzini implements Comparator { - public int compare(Put r1, Put r2) { - return r1.getLength() - r2.getLength(); - } + public int compare(Put r1, Put r2) { + return r1.getLength() - r2.getLength(); + } } // Komparator za puteve po vrednosti resenja class KomparatorPoVredosti implements Comparator { - public int compare(Put r1, Put r2) { - return r2.getVrednost() - r1.getVrednost(); - } + public int compare(Put r1, Put r2) { + return r2.getVrednost() - r1.getVrednost(); + } } diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/LavirintProgram.java b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/LavirintProgram.java index 328f62c..0edaac8 100644 --- a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/LavirintProgram.java +++ b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/LavirintProgram.java @@ -1,71 +1,70 @@ /** * Program za nalazenje puta u lavirintu. - * + * * Date su cetiri varijante problema, od jednostavnijih ka slozenijima, radi * ilustracije osnovnih koncepata i postepenog uvodjenja novih. - * + * * Najjednostavnije je samo nalazenje da li put postoji. - * + * * Prosirenje tog resenja nam ispisuje taj nadjeni put. - * + * * Treca varijanta nalazi sve puteve i medju njima bira najkraci. - * + * * Cetvrta varijanta resava lavirint u kome su rasuti zlatnici na poljima i * nalazi put na kome se kupi najvise zlatnika. */ - public class LavirintProgram { - public static void main(String[] args) { - Svetovid.out.println("Unesite ime fajla: "); - String fajl = Svetovid.in.readLine(); - if (!Svetovid.testIn(fajl)) { - System.out.println("Greska: nema fajla!"); - return; - } + public static void main(String[] args) { + Svetovid.out.println("Unesite ime fajla: "); + String fajl = Svetovid.in.readLine(); + if (!Svetovid.testIn(fajl)) { + System.out.println("Greska: nema fajla!"); + return; + } - System.out.println("1 - da li postoji put"); - System.out.println("2 - ispis nekog puta (ako postoji)"); - System.out.println("3 - nalazenje najkraceg puta"); - System.out.println("4 - nalazenje najvrednijeg puta"); - System.out.println("Unesite izbor 1-4:"); - int op = Svetovid.in.readInt(); + System.out.println("1 - da li postoji put"); + System.out.println("2 - ispis nekog puta (ako postoji)"); + System.out.println("3 - nalazenje najkraceg puta"); + System.out.println("4 - nalazenje najvrednijeg puta"); + System.out.println("Unesite izbor 1-4:"); + int op = Svetovid.in.readInt(); - Lavirint lavirint = new Lavirint(fajl); - Put put; + Lavirint lavirint = new Lavirint(fajl); + Put put; - if (lavirint != null) { + if (lavirint != null) { - switch (op) { - case 1: - if (lavirint.postojiPut(0, 0)) { - System.out.println("Postoji put"); - } else { - System.out.println("Ne postoji put"); - } - break; - case 2: - lavirint.nadjiPut(0, 0); - break; - case 3: - put = lavirint.najkraciPut(0, 0); - if (put != null) { - put.stampaj(); - } else { - System.out.println("Ne postoji put"); - } - break; - case 4: - put = lavirint.najvrednijiPut(0, 0); - if (put != null) { - put.stampaj(); - } else { - System.out.println("Ne postoji put"); - } - break; - default: - System.err.println("Uneli ste pogresan izbor"); - } - } - } -} \ No newline at end of file + switch (op) { + case 1: + if (lavirint.postojiPut(0, 0)) { + System.out.println("Postoji put"); + } else { + System.out.println("Ne postoji put"); + } + break; + case 2: + lavirint.nadjiPut(0, 0); + break; + case 3: + put = lavirint.najkraciPut(0, 0); + if (put != null) { + put.stampaj(); + } else { + System.out.println("Ne postoji put"); + } + break; + case 4: + put = lavirint.najvrednijiPut(0, 0); + if (put != null) { + put.stampaj(); + } else { + System.out.println("Ne postoji put"); + } + break; + default: + System.err.println("Uneli ste pogresan izbor"); + } + } + } +} diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Mapa.java b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Mapa.java index 091f37d..a156601 100644 --- a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Mapa.java +++ b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Mapa.java @@ -1,95 +1,94 @@ - /** * Klasa Mapa koristi se za reprezentaciju lavirint i njegovih polja. */ public class Mapa { - // Vrednosti polja i njihova znacenja - public final static int IZLAZ = -5; - public final static int ZID = -1; - public final static int GRESKA = Integer.MIN_VALUE; + // Vrednosti polja i njihova znacenja + public final static int IZLAZ = -5; + public final static int ZID = -1; + public final static int GRESKA = Integer.MIN_VALUE; + + // Dimenzije mape + private int visina, sirina; + + // Polja mape + private int[][] mat; - // Dimenzije mape - private int visina, sirina; - - // Polja mape - private int[][] mat; + // Prilikom pretrazivanja ovde mozemo pamtiti koja polja smo posetili a koja nismo + private boolean[][] pos; - // Prilikom pretrazivanja ovde mozemo pamtiti koja polja smo posetili a koja nismo - private boolean[][] pos; + public int getSirina() { + return sirina; + } - public int getSirina() { - return sirina; - } + public int getVisina() { + return visina; + } - public int getVisina() { - return visina; - } + public void setPos(int x, int y, boolean b) { + if (0 <= x && x < sirina && 0 <= y && y < visina) { + pos[x][y] = b; + } + } - public void setPos(int x, int y, boolean b) { - if (0 <= x && x < sirina && 0 <= y && y < visina) { - pos[x][y] = b; - } - } + public boolean getPos(int x, int y) { + if (0 <= x && x < sirina && 0 <= y && y < visina) { + return pos[x][y]; + } else { + return true; + } + } - public boolean getPos(int x, int y) { - if (0 <= x && x < sirina && 0 <= y && y < visina) { - return pos[x][y]; - } else { - return true; - } - } + public int getMat(int x, int y) { + if (0 <= x && x < sirina && 0 <= y && y < visina) { + return mat[x][y]; + } else { + return GRESKA; + } + } - public int getMat(int x, int y) { - if (0 <= x && x < sirina && 0 <= y && y < visina) { - return mat[x][y]; - } else { - return GRESKA; - } - } + public Mapa(int sirina, int visina) { + this.sirina = sirina; + this.visina = visina; + mat = new int[sirina][visina]; + pos = new boolean[sirina][visina]; + } - public Mapa(int sirina, int visina) { - this.sirina = sirina; - this.visina = visina; - mat = new int[sirina][visina]; - pos = new boolean[sirina][visina]; - } + public Mapa(String imeFajla) { + if (!Svetovid.testIn(imeFajla)) { + throw new RuntimeException("Fajl za kreiranje mape (" + imeFajla + ") nije prisupacan"); + } + sirina = Svetovid.in(imeFajla).readInt(); + visina = Svetovid.in(imeFajla).readInt(); + mat = new int[sirina][visina]; + pos = new boolean[sirina][visina]; + for (int j = 0; j < visina; j++) { + for (int i = 0; i < sirina; i++) { + mat[i][j] = Svetovid.in(imeFajla).readInt(); + } + } + Svetovid.closeIn(imeFajla); + Prikaz.boja(ZID, Prikaz.CRNA, null); + Prikaz.boja(IZLAZ, Prikaz.CRVENA, Prikaz.BELA); + Prikaz.boja(1, 20, Prikaz.SVETLO_ZELENA, Prikaz.ZELENA, Prikaz.CRNA); + Prikaz.boja(99, Prikaz.ZUTA, Prikaz.CRNA); + Prikaz.mapa("Lavirint", getSirina(), getVisina(), this::getMat); + } - public Mapa(String imeFajla) { - if (!Svetovid.testIn(imeFajla)) { - throw new RuntimeException("Fajl za kreiranje mape (" + imeFajla + ") nije prisupacan"); - } - sirina = Svetovid.in(imeFajla).readInt(); - visina = Svetovid.in(imeFajla).readInt(); - mat = new int[sirina][visina]; - pos = new boolean[sirina][visina]; - for (int j = 0; j < visina; j++) { - for (int i = 0; i < sirina; i++) { - mat[i][j] = Svetovid.in(imeFajla).readInt(); - } - } - Svetovid.closeIn(imeFajla); - Prikaz.boja(ZID, Prikaz.CRNA, null); - Prikaz.boja(IZLAZ, Prikaz.CRVENA, Prikaz.BELA); - Prikaz.boja(1, 20, Prikaz.SVETLO_ZELENA, Prikaz.ZELENA, Prikaz.CRNA); - Prikaz.boja(99, Prikaz.ZUTA, Prikaz.CRNA); - Prikaz.mapa("Lavirint", getSirina(), getVisina(), this::getMat); - } + public void stampaj() { + if (visina != 0 && sirina != 0) { + System.out.println(); + System.out.println("Mapa sirine " + sirina + " i visine " + visina); + for (int j = 0; j < visina; j++) { + for (int i = 0; i < sirina; i++) { + System.out.printf("%5d", mat[i][j]); + } + System.out.println(); + } + } + } - public void stampaj() { - if (visina != 0 && sirina != 0) { - System.out.println(); - System.out.println("Mapa sirine " + sirina + " i visine " + visina); - for (int j = 0; j < visina; j++) { - for (int i = 0; i < sirina; i++) { - System.out.printf("%5d", mat[i][j]); - } - System.out.println(); - } - } - } - - public String toString() { - return "Mapa velicine " + sirina + " x " + visina; - } + public String toString() { + return "Mapa velicine " + sirina + " x " + visina; + } } diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Polje.java b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Polje.java index 15676d1..c0dbb15 100644 --- a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Polje.java +++ b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Polje.java @@ -4,27 +4,27 @@ */ public class Polje { - private final int x, y, v; + private final int x, y, v; - public Polje(int x, int y, int v) { - this.x = x; - this.y = y; - this.v = v; - } + public Polje(int x, int y, int v) { + this.x = x; + this.y = y; + this.v = v; + } - public int getX() { - return x; - } + public int getX() { + return x; + } - public int getY() { - return y; - } + public int getY() { + return y; + } - public int getV() { - return v; - } + public int getV() { + return v; + } - public String toString() { - return "(" + x + ", " + y + ") " + v; - } + public String toString() { + return "(" + x + ", " + y + ") " + v; + } } diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Put.java b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Put.java index 9ecf9a1..c6bdda8 100644 --- a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Put.java +++ b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Put.java @@ -9,91 +9,91 @@ import javafx.scene.paint.Color; */ public class Put { - // Pamtimo sva polja na putu - private ArrayList polja; - - // Dodato da se omoguci pristup poljima puta "od spolja" (za proveru kvaliteta puta na primer), - // ali tako da ne moze da se utice na sam sadrzaj te liste - private List nepromenljivaListaPolja; - - // Potrebno za graficki prikaz - private String naziv; - - // Potrebno za graficki prikaz - private Put(String naziv, Color boja) { - polja = new ArrayList(); - nepromenljivaListaPolja = Collections.unmodifiableList(polja); - this.naziv = naziv; - Prikaz.put(naziv, polja, Polje::getX, Polje::getY, this::toString, boja); - } - - // Kreira novo prazno resenje - public Put() { - this("Trenutni", Prikaz.TIRKIZNA); - } - - // Kreira novo resenje sa istim sadrzajem kao original - public Put(Put original) { - this("Optimalan", Prikaz.LJUBICASTA); - polja.addAll(original.polja); - } - - // Dodaje polje u resenje - public void dodaj(int x, int y, int v) { - polja.add(new Polje(x, y, v)); - Prikaz.osveziPut(naziv); - } - - // Izbacuje poslednje polje iz puta - public void izbaciKraj() { - if (getLength() > 0) { - polja.remove(getLength() - 1); - Prikaz.osveziPut(naziv); - } else { - throw new IllegalStateException("Resenje je vec prazno"); - } - } - - // Stampa put - public void stampaj() { - System.out.println(); - System.out.println("Put duzine " + getLength() + " i vrednosti " + getVrednost()); - for (int i = 0; i < getLength(); i++) { - System.out.println(polja.get(i)); - } - Prikaz.put("Trenutni", null, null, null); - Prikaz.put("Optimalan", null, null, null); - Prikaz.put("Najbolji", polja, Polje::getX, Polje::getY, this::toString, Prikaz.LJUBICASTA); - } - - public String toString() { - return getVrednost() + "\u20ac " + getLength() + "m"; - } - - // Vraca duzinu puta - public int getLength() { - return polja.size(); - } - - // Vraca i-to polje na putu - // Ne koristi se u ovoj verziji zadatka. Moze se koristiti za proveru kvaliteta resenja - public Polje getPolje(int i) { - return polja.get(i); - } - - // Vraca sva polja na putu - // Ne koristi se u ovoj verziji zadatka. Moze se koristiti za proveru kvaliteta resenja - public List getPolja() { - return nepromenljivaListaPolja; - } - - // Vraca vrednost puta - // Vrednost se definise kao zbir svih vrednosti polja na putu - public int getVrednost() { - int rez = 0; - for (Polje p : polja) { - rez = rez + p.getV(); - } - return rez; - } + // Pamtimo sva polja na putu + private ArrayList polja; + + // Dodato da se omoguci pristup poljima puta "od spolja" (za proveru kvaliteta puta na primer), + // ali tako da ne moze da se utice na sam sadrzaj te liste + private List nepromenljivaListaPolja; + + // Potrebno za graficki prikaz + private String naziv; + + // Potrebno za graficki prikaz + private Put(String naziv, Color boja) { + polja = new ArrayList(); + nepromenljivaListaPolja = Collections.unmodifiableList(polja); + this.naziv = naziv; + Prikaz.put(naziv, polja, Polje::getX, Polje::getY, this::toString, boja); + } + + // Kreira novo prazno resenje + public Put() { + this("Trenutni", Prikaz.TIRKIZNA); + } + + // Kreira novo resenje sa istim sadrzajem kao original + public Put(Put original) { + this("Optimalan", Prikaz.LJUBICASTA); + polja.addAll(original.polja); + } + + // Dodaje polje u resenje + public void dodaj(int x, int y, int v) { + polja.add(new Polje(x, y, v)); + Prikaz.osveziPut(naziv); + } + + // Izbacuje poslednje polje iz puta + public void izbaciKraj() { + if (getLength() > 0) { + polja.remove(getLength() - 1); + Prikaz.osveziPut(naziv); + } else { + throw new IllegalStateException("Resenje je vec prazno"); + } + } + + // Stampa put + public void stampaj() { + System.out.println(); + System.out.println("Put duzine " + getLength() + " i vrednosti " + getVrednost()); + for (int i = 0; i < getLength(); i++) { + System.out.println(polja.get(i)); + } + Prikaz.put("Trenutni", null, null, null); + Prikaz.put("Optimalan", null, null, null); + Prikaz.put("Najbolji", polja, Polje::getX, Polje::getY, this::toString, Prikaz.LJUBICASTA); + } + + public String toString() { + return getVrednost() + "\u20ac " + getLength() + "m"; + } + + // Vraca duzinu puta + public int getLength() { + return polja.size(); + } + + // Vraca i-to polje na putu + // Ne koristi se u ovoj verziji zadatka. Moze se koristiti za proveru kvaliteta resenja + public Polje getPolje(int i) { + return polja.get(i); + } + + // Vraca sva polja na putu + // Ne koristi se u ovoj verziji zadatka. Moze se koristiti za proveru kvaliteta resenja + public List getPolja() { + return nepromenljivaListaPolja; + } + + // Vraca vrednost puta + // Vrednost se definise kao zbir svih vrednosti polja na putu + public int getVrednost() { + int rez = 0; + for (Polje p : polja) { + rez = rez + p.getV(); + } + return rez; + } } -- 2.25.1