gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
ObjedinjenoResenje preimenovano u (adekvatnije) SuperKomplikovanoResenje
authorDoni Pracner <quinnuendo@gmail.com>
Tue, 5 Dec 2017 14:52:44 +0000 (15:52 +0100)
committerDoni Pracner <quinnuendo@gmail.com>
Tue, 5 Dec 2017 14:52:44 +0000 (15:52 +0100)
36 files changed:
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Lavirint.java [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/LavirintProgram.java [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Mapa.java [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Polje.java [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Prikaz.java [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Put.java [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/blago1.txt [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/blago2.txt [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/blago3.txt [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l-prazan.txt [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l1.txt [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l2.txt [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l3.txt [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l4.txt [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/lav.txt [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/lavblok.txt [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/readme.txt [deleted file]
PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/zadatak-lavirint.txt [deleted file]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Lavirint.java [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/LavirintProgram.java [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Mapa.java [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Polje.java [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Prikaz.java [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Put.java [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/blago1.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/blago2.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/blago3.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l-prazan.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l1.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l2.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l3.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l4.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/lav.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/lavblok.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/readme.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/zadatak-lavirint.txt [new file with mode: 0644]

diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Lavirint.java b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Lavirint.java
deleted file mode 100644 (file)
index 5b84e5a..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-import java.util.Comparator;\r
-\r
-/**\r
- * Klasa Lavirint sadrzi 3 javne i tri privatne metode za trazenje puteva.\r
- *\r
- * Klase KomparatorPoDuzini i KomparatorPoVrednosti predstavljaju komparatore\r
- * koji se korste pri trazenju najkraceg i najvrednijeg puta.\r
- */\r
-public class Lavirint {\r
-\r
-       // Polje m sadrzi kompletnu mapu\r
-       private Mapa m;\r
-\r
-       // Polje optResenje sluzi za pamcenje optimalnog resenja\r
-       private Put optResenje;\r
-\r
-       // Ucitava mapu iz datog fajla i stampa je na ekran\r
-       Lavirint(String imeFajla) {\r
-               m = new Mapa(imeFajla);\r
-               m.stampaj();\r
-       }\r
-\r
-       // Provarava da li postoji put do izlaza i vraca vrednost true\r
-       // ako postoji put ili vrednost false ako ne postoji\r
-       public boolean postojiPut(int x, int y) {\r
-               if (x < 0 || x >= m.getSirina() || y < 0 || y >= m.getVisina()) {\r
-                       return false;\r
-               }\r
-               if (m.getPos(x, y) == true) {\r
-                       return false;\r
-               }\r
-               if (m.getMat(x, y) == Mapa.ZID) {\r
-                       return false;\r
-               }\r
-               if (m.getMat(x, y) == Mapa.IZLAZ) {\r
-                       return true;\r
-               }\r
-               m.setPos(x, y, true);\r
-               if (postojiPut(x + 1, y)) {\r
-                       return true;\r
-               }\r
-               if (postojiPut(x - 1, y)) {\r
-                       return true;\r
-               }\r
-               if (postojiPut(x, y + 1)) {\r
-                       return true;\r
-               }\r
-               if (postojiPut(x, y - 1)) {\r
-                       return true;\r
-               }\r
-               m.setPos(x, y, false);\r
-               return false;\r
-       }\r
-\r
-       // Poziva metodu rput da pronadje i ispise put, ako postoji\r
-       // Ukoliko put ne postoji, ispisuje poruku o gresci\r
-       public void nadjiPut(int x, int y) {\r
-               if (!rput(x, y)) {\r
-                       System.err.println("Ne postoji put");\r
-               }\r
-       }\r
-\r
-       // Proverava da li postoji put korsiteci pretrazivanje sa vracanjem\r
-       // Ukoliko se pronadje izlaz iz lavirinta, stampa se put u obrnutom\r
-       // redosledu\r
-       // Put se stampa pri povratku iz rekurzije\r
-       private boolean rput(int x, int y) {\r
-               if (x < 0 || x >= m.getSirina() || y < 0 || y >= m.getVisina()) {\r
-                       return false;\r
-               }\r
-               if (m.getPos(x, y)) {\r
-                       return false;\r
-               }\r
-               if (m.getMat(x, y) == Mapa.ZID) {\r
-                       return false;\r
-               }\r
-               if (m.getMat(x, y) == Mapa.IZLAZ) {\r
-                       System.out.println(x + " " + y);\r
-                       return true;\r
-               }\r
-               m.setPos(x, y, true);\r
-               if (rput(x + 1, y) || rput(x, y + 1) || rput(x, y - 1)\r
-                               || rput(x - 1, y)) {\r
-                       System.out.println(x + " " + y);\r
-                       return true;\r
-               }\r
-               m.setPos(x, y, false);\r
-               return false;\r
-       }\r
-\r
-       // Kreira optimalno resenje za put, pri cemu se za optimalnost resenja\r
-       // koristi komparator po duzini resenja, tj. trazi se najkrace resenje\r
-       // Samo resenje kreira se u metodi optPut\r
-       public Put najkraciPut(int x, int y) {\r
-               Put r = new Put();\r
-               optPut(x, y, r, new KomparatorPoDuzini());\r
-               return optResenje;\r
-       }\r
-\r
-       // Kreira optimalno resenje za put, pri cemu se za optimalnost resenja\r
-       // koristi komparator po duzini resenja, tj. trazi se najvrednije resenje\r
-       // Samo resenje kreira se u metodi optPut\r
-       public Put najvrednijiPut(int x, int y) {\r
-               Put trenutni = new Put();\r
-               optPut(x, y, trenutni, new KomparatorPoVredosti());\r
-               return optResenje;\r
-       }\r
-\r
-       // Proverava da li postoji put korsiteci pretrazivanje sa vracanjem\r
-       // Ukoliko se pronadje na prvi ili optimalniji put, taj put se pamti u\r
-       // optResenje\r
-       // Optimalnost puta se proverava komparatorom\r
-       private void optPut(int x, int y, Put trenutni, Comparator<Put> c) {\r
-               if (x < 0 || x >= m.getSirina() || y < 0 || y >= m.getVisina()) {\r
-                       return;\r
-               }\r
-               if (m.getPos(x, y)) {\r
-                       return;\r
-               }\r
-               if (m.getMat(x, y) == Mapa.ZID) {\r
-                       return;\r
-               }\r
-               if (m.getMat(x, y) == Mapa.IZLAZ) {\r
-                       trenutni.dodaj(x, y, 0);\r
-                       if (optResenje == null || c.compare(trenutni, optResenje) < 0) {\r
-                               optResenje = new Put(trenutni);\r
-                       }\r
-                       trenutni.izbaciKraj();\r
-                       return;\r
-               }\r
-\r
-               // pokusavamo da trazimo dalje put\r
-               m.setPos(x, y, true);\r
-               trenutni.dodaj(x, y, m.getMat(x, y));\r
-               optPut(x + 1, y, trenutni, c);\r
-               optPut(x, y + 1, trenutni, c);\r
-               optPut(x, y - 1, trenutni, c);\r
-               optPut(x - 1, y, trenutni, c);\r
-               m.setPos(x, y, false);\r
-               trenutni.izbaciKraj();\r
-       }\r
-}\r
-\r
-// Komparator za puteve  po duzini resenja\r
-class KomparatorPoDuzini implements Comparator<Put> {\r
-       public int compare(Put r1, Put r2) {\r
-               return r1.getLength() - r2.getLength();\r
-       }\r
-}\r
-\r
-// Komparator za puteve po vrednosti resenja\r
-class KomparatorPoVredosti implements Comparator<Put> {\r
-       public int compare(Put r1, Put r2) {\r
-               return r2.getVrednost() - r1.getVrednost();\r
-       }\r
-}\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/LavirintProgram.java b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/LavirintProgram.java
deleted file mode 100644 (file)
index 01adf52..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/**\r
- * Program za nalazenje puta u lavirintu.\r
- * \r
- * Date su cetiri varijante problema, od jednostavnijih ka slozenijima, radi\r
- * ilustracije osnovnih koncepata i postepenog uvodjenja novih.\r
- * \r
- * Najjednostavnije je samo nalazenje da li put postoji.\r
- * \r
- * Prosirenje tog resenja nam ispisuje taj nadjeni put.\r
- * \r
- * Treca varijanta nalazi sve puteve i medju njima bira najkraci.\r
- * \r
- * Cetvrta varijanta resava lavirint u kome su rasuti zlatnici na poljima i\r
- * nalazi put na kome se kupi najvise zlatnika.\r
- */\r
-\r
-public class LavirintProgram {\r
-\r
-       public static void main(String[] args) {\r
-               Svetovid.out.println("Unesite ime fajla: ");\r
-               String fajl = Svetovid.in.readLine();\r
-               if (!Svetovid.testIn(fajl)) {\r
-                       System.out.println("Greska: nema fajla!");\r
-                       return;\r
-               }\r
-\r
-               Lavirint l = new Lavirint(fajl);\r
-               Put r;\r
-\r
-               if (l != null) {\r
-                       System.out.println("1 - da li postoji put");\r
-                       System.out.println("2 - ispis nekog puta (ako postoji)");\r
-                       System.out.println("3 - nalazenje najkraceg puta");\r
-                       System.out.println("4 - nalazenje najvrednijeg puta");\r
-                       System.out.println("Unesite izbor 1-4:");\r
-                       int op = Svetovid.in.readInt();\r
-\r
-                       switch (op) {\r
-                       case 1:\r
-                               if (l.postojiPut(0, 0)) {\r
-                                       System.out.println("Postoji put");\r
-                               } else {\r
-                                       System.out.println("Ne postoji put");\r
-                               }\r
-                               break;\r
-                       case 2:\r
-                               l.nadjiPut(0, 0);\r
-                               break;\r
-                       case 3:\r
-                               r = l.najkraciPut(0, 0);\r
-                               if (r != null) {\r
-                                       r.stampaj();\r
-                               } else {\r
-                                       System.out.println("Nema resenja");\r
-                               }\r
-                               break;\r
-                       case 4:\r
-                               r = l.najvrednijiPut(0, 0);\r
-                               if (r != null) {\r
-                                       r.stampaj();\r
-                                       System.out.println("Vrednost puta: " + r.getVrednost());\r
-                               } else {\r
-                                       System.out.println("Nema resenja");\r
-                               }\r
-                               break;\r
-                       default:\r
-                               System.err.println("Uneli ste pogresan izbor");\r
-                       }\r
-               }\r
-       }\r
-}
\ No newline at end of file
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Mapa.java b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Mapa.java
deleted file mode 100644 (file)
index a39c662..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-\r
-/**\r
- * Klasa Mapa koristi se za reprezentaciju lavirint i njegovih polja.\r
- */\r
-public class Mapa {\r
-\r
-       // Vrednosti polja i njihova znacenja\r
-       public final static int IZLAZ = -5;\r
-       public final static int ZID = -1;\r
-       public final static int GRESKA = Integer.MIN_VALUE;\r
-\r
-       // Dimenzije mape\r
-       private int visina, sirina;\r
-       \r
-       // Polja mape\r
-       private int[][] mat;\r
-\r
-       // Prilikom pretrazivanja ovde mozemo pamtiti koja polja smo posetili a koja nismo\r
-       private boolean[][] pos;\r
-\r
-       public int getSirina() {\r
-               return sirina;\r
-       }\r
-\r
-       public int getVisina() {\r
-               return visina;\r
-       }\r
-\r
-       public void setPos(int x, int y, boolean b) {\r
-               if (0 <= x && x < sirina && 0 <= y && y < visina) {\r
-                       pos[x][y] = b;\r
-               }\r
-       }\r
-\r
-       public boolean getPos(int x, int y) {\r
-               if (0 <= x && x < sirina && 0 <= y && y < visina) {\r
-                       return pos[x][y];\r
-               } else {\r
-                       return true;\r
-               }\r
-       }\r
-\r
-       public int getMat(int x, int y) {\r
-               if (0 <= x && x < sirina && 0 <= y && y < visina) {\r
-                       return mat[x][y];\r
-               } else {\r
-                       return GRESKA;\r
-               }\r
-       }\r
-\r
-       public Mapa(int sirina, int visina) {\r
-               this.sirina = sirina;\r
-               this.visina = visina;\r
-               mat = new int[sirina][visina];\r
-               pos = new boolean[sirina][visina];\r
-       }\r
-\r
-       public Mapa(String imeFajla) {\r
-               if (!Svetovid.testIn(imeFajla)) {\r
-                       throw new RuntimeException("Fajl za kreiranje mape (" + imeFajla + ") nije prisupacan");\r
-               }\r
-               sirina = Svetovid.in(imeFajla).readInt();\r
-               visina = Svetovid.in(imeFajla).readInt();\r
-               mat = new int[sirina][visina];\r
-               pos = new boolean[sirina][visina];\r
-               for (int j = 0; j < visina; j++) {\r
-                       for (int i = 0; i < sirina; i++) {\r
-                               mat[i][j] = Svetovid.in(imeFajla).readInt();\r
-                       }\r
-               }\r
-               Svetovid.closeIn(imeFajla);\r
-               Prikaz.boja(ZID, Prikaz.CRNA, null);\r
-               Prikaz.boja(IZLAZ, Prikaz.CRVENA, Prikaz.BELA);\r
-               Prikaz.boja(1, 20, Prikaz.SVETLO_ZELENA, Prikaz.ZELENA, Prikaz.CRNA);\r
-               Prikaz.boja(99, Prikaz.ZUTA, Prikaz.CRNA);\r
-               Prikaz.mapa("Lavirint", getSirina(), getVisina(), this::getMat);\r
-       }\r
-\r
-       public void stampaj() {\r
-               if (visina != 0 && sirina != 0) {\r
-                       System.out.println(visina + " " + sirina);\r
-                       for (int j = 0; j < visina; j++) {\r
-                               for (int i = 0; i < sirina; i++) {\r
-                                       System.out.print(mat[i][j] + "\t");\r
-                               }\r
-                               System.out.println();\r
-                       }\r
-               }\r
-       }\r
-       \r
-       public String toString() {\r
-               return "Mapa velicine " + sirina + " x " + visina;\r
-       }\r
-}\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Polje.java b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Polje.java
deleted file mode 100644 (file)
index 15676d1..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/**\r
- * Klasa Polje se koristi za pamcenje x i y koordinata nekog polja, kao i\r
- * vrednosti na toj poziciji u mapi\r
- */\r
-public class Polje {\r
-\r
-       private final int x, y, v;\r
-\r
-       public Polje(int x, int y, int v) {\r
-               this.x = x;\r
-               this.y = y;\r
-               this.v = v;\r
-       }\r
-\r
-       public int getX() {\r
-               return x;\r
-       }\r
-\r
-       public int getY() {\r
-               return y;\r
-       }\r
-\r
-       public int getV() {\r
-               return v;\r
-       }\r
-\r
-       public String toString() {\r
-               return "(" + x + ", " + y + ") " + v;\r
-       }\r
-}\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Prikaz.java b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Prikaz.java
deleted file mode 100644 (file)
index aa95160..0000000
+++ /dev/null
@@ -1,487 +0,0 @@
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.LinkedHashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.function.Function;\r
-\r
-import javafx.application.Application;\r
-import javafx.application.Platform;\r
-import javafx.collections.FXCollections;\r
-import javafx.collections.ObservableList;\r
-import javafx.geometry.Insets;\r
-import javafx.geometry.VPos;\r
-import javafx.scene.Scene;\r
-import javafx.scene.canvas.Canvas;\r
-import javafx.scene.canvas.GraphicsContext;\r
-import javafx.scene.control.Button;\r
-import javafx.scene.control.Label;\r
-import javafx.scene.control.ListCell;\r
-import javafx.scene.control.ListView;\r
-import javafx.scene.control.Slider;\r
-import javafx.scene.layout.BorderPane;\r
-import javafx.scene.layout.ColumnConstraints;\r
-import javafx.scene.layout.GridPane;\r
-import javafx.scene.layout.Priority;\r
-import javafx.scene.layout.StackPane;\r
-import javafx.scene.layout.VBox;\r
-import javafx.scene.paint.Color;\r
-import javafx.scene.paint.Paint;\r
-import javafx.scene.shape.Circle;\r
-import javafx.scene.shape.StrokeLineCap;\r
-import javafx.scene.shape.StrokeLineJoin;\r
-import javafx.scene.text.Font;\r
-import javafx.scene.text.FontWeight;\r
-import javafx.scene.text.TextAlignment;\r
-import javafx.stage.Stage;\r
-\r
-public class Prikaz extends Application {\r
-\r
-    public static final Color STVARNO_BELA = Color.hsb(0, 0, 1.0);\r
-    public static final Color BELA         = Color.hsb(0, 0, 0.95);\r
-    public static final Color SVETLO_SIVA  = Color.hsb(0, 0, 0.8);\r
-    public static final Color SIVA         = Color.hsb(0, 0, 0.6);\r
-    public static final Color TAMNO_SIVA   = Color.hsb(0, 0, 0.4);\r
-    public static final Color CRNA         = Color.hsb(0, 0, 0.2);\r
-    public static final Color STVARNO_CRNA = Color.hsb(0, 0, 0.0);\r
-\r
-    public static final Color SVETLO_CRVENA      = Color.hsb(  0, 0.2, 1.0);\r
-    public static final Color SVETLO_NARANDZASTA = Color.hsb( 30, 0.2, 1.0);\r
-    public static final Color SVETLO_ZUTA        = Color.hsb( 60, 0.2, 1.0);\r
-    public static final Color SVETLO_ZELENA      = Color.hsb(120, 0.2, 1.0);\r
-    public static final Color SVETLO_TIRKIZNA    = Color.hsb(180, 0.2, 1.0);\r
-    public static final Color SVETLO_AZURNA      = Color.hsb(210, 0.2, 1.0);\r
-    public static final Color SVETLO_PLAVA       = Color.hsb(240, 0.2, 1.0);\r
-    public static final Color SVETLO_PURPURNA    = Color.hsb(270, 0.2, 1.0);\r
-    public static final Color SVETLO_LJUBICASTA  = Color.hsb(300, 0.2, 1.0);\r
-    public static final Color SVETLO_RUZICASTA   = Color.hsb(330, 0.2, 1.0);\r
-\r
-    public static final Color CRVENA      = Color.hsb(  0, 0.9, 0.8);\r
-    public static final Color NARANDZASTA = Color.hsb( 30, 0.9, 0.8);\r
-    public static final Color ZUTA        = Color.hsb( 60, 0.9, 0.8);\r
-    public static final Color ZELENA      = Color.hsb(120, 0.9, 0.8);\r
-    public static final Color TIRKIZNA    = Color.hsb(180, 0.9, 0.8);\r
-    public static final Color AZURNA      = Color.hsb(210, 0.9, 0.8);\r
-    public static final Color PLAVA       = Color.hsb(240, 0.9, 0.8);\r
-    public static final Color PURPURNA    = Color.hsb(270, 0.9, 0.8);\r
-    public static final Color LJUBICASTA  = Color.hsb(300, 0.9, 0.8);\r
-    public static final Color RUZICASTA   = Color.hsb(330, 0.9, 0.8);\r
-\r
-    public static final Color TAMNO_CRVENA      = Color.hsb(  0, 0.8, 0.4);\r
-    public static final Color TAMNO_NARANDZASTA = Color.hsb( 30, 0.8, 0.4);\r
-    public static final Color TAMNO_ZUTA        = Color.hsb( 60, 0.8, 0.4);\r
-    public static final Color TAMNO_ZELENA      = Color.hsb(120, 0.8, 0.4);\r
-    public static final Color TAMNO_TIRKIZNA    = Color.hsb(180, 0.8, 0.4);\r
-    public static final Color TAMNO_AZURNA      = Color.hsb(210, 0.8, 0.4);\r
-    public static final Color TAMNO_PLAVA       = Color.hsb(240, 0.8, 0.4);\r
-    public static final Color TAMNO_PURPURNA    = Color.hsb(270, 0.8, 0.4);\r
-    public static final Color TAMNO_LJUBICASTA  = Color.hsb(300, 0.8, 0.4);\r
-    public static final Color TAMNO_RUZICASTA   = Color.hsb(330, 0.8, 0.4);\r
-\r
-    ////////////////////\r
-    // Boje i stilovi //\r
-    ////////////////////\r
-\r
-    protected static Paint bojaPozadine = BELA;\r
-    protected static Paint bojaOkvira = CRNA;\r
-    protected static Map<Integer, Paint> bojaPoljaPozadina = new HashMap<>();\r
-    protected static Map<Integer, Paint> bojaPoljaTekst = new HashMap<>();\r
-    protected static Font font = Font.font("Arial", FontWeight.BOLD, 12);\r
-\r
-    public static void boja(Paint pozadina, Paint okvir) {\r
-        bojaPozadine = pozadina;\r
-        bojaOkvira = okvir;\r
-    }\r
-\r
-    public static void boja(int vrednost, Paint bojaPozadine, Paint bojaTeksta) {\r
-        if (bojaPozadine == null) {\r
-            bojaPoljaPozadina.remove(vrednost);\r
-        }\r
-        bojaPoljaPozadina.put(vrednost, bojaPozadine);\r
-        if (bojaTeksta == null) {\r
-            bojaPoljaTekst.remove(vrednost);\r
-        }\r
-        bojaPoljaTekst.put(vrednost, bojaTeksta);\r
-    }\r
-\r
-    public static void boja(int vrednostMin, int vrednostMax, Color bojaMin, Color bojaMax, Paint bojaTeksta) {\r
-        if (bojaMin == null || bojaMax == null) {\r
-            throw new IllegalArgumentException();\r
-        }\r
-        int n = vrednostMax - vrednostMin;\r
-        for (int i = 0; i <= n; i++) {\r
-            int vrednost = vrednostMin + i;\r
-            bojaPoljaPozadina.put(vrednost, bojaMin.interpolate(bojaMax, (double) (i) / n));\r
-            if (bojaTeksta == null) {\r
-                bojaPoljaTekst.remove(vrednost);\r
-            }\r
-            bojaPoljaTekst.put(vrednost, bojaTeksta);\r
-        }\r
-    }\r
-\r
-    ////////////////\r
-    // Geometrija //\r
-    ////////////////\r
-\r
-    private static double velicinaPolja = 32;\r
-    private static double velicinaRazmaka = 4;\r
-    private static int debljinaOkvira = 0;\r
-    private static double debljinaPuta = velicinaPolja / 2;\r
-\r
-    public static void velicina(double polje, double razmak, int okvir) {\r
-        velicinaPolja = polje;\r
-        velicinaRazmaka = razmak;\r
-        debljinaOkvira = okvir;\r
-        debljinaPuta = velicinaPolja / 2;\r
-    }\r
-\r
-    protected static double ukupnaDuzina(int brojPolja) {\r
-        return x(brojPolja + debljinaOkvira, 0.0);\r
-    }\r
-\r
-    protected static double x(int indeks, double delta) {\r
-        indeks = indeks + debljinaOkvira;\r
-        return indeks * (velicinaPolja + velicinaRazmaka) + velicinaRazmaka + velicinaPolja * delta;\r
-    }\r
-\r
-    protected static double x(int indeks) {\r
-        return x(indeks, 0.0);\r
-    }\r
-\r
-    protected static double k(int indeks) {\r
-        return x(indeks, 0.5);\r
-    }\r
-\r
-    protected static double w(int count, double delta) {\r
-        return (velicinaPolja + velicinaRazmaka) * count + velicinaRazmaka * (delta - 1);\r
-    }\r
-\r
-    protected static double w(int count) {\r
-        return w(count, 0);\r
-    }\r
-\r
-    protected static double r() {\r
-        return 2 * velicinaRazmaka;\r
-    }\r
-\r
-    /////////////\r
-    // Sadrzaj //\r
-    /////////////\r
-\r
-    protected static String naslovProzora;\r
-    protected static int sirinaMape;\r
-    protected static int visinaMape;\r
-    protected static FunkcijaZaMapu funkcijaZaMapu;\r
-\r
-    @FunctionalInterface\r
-    public static interface FunkcijaZaMapu {\r
-        public int vrednostNa(int x, int y);\r
-    }\r
-\r
-    public static void mapa(String naslov, int sirina, int visina, FunkcijaZaMapu funkcijaZaMapu) {\r
-        naslovProzora = naslov;\r
-        sirinaMape = sirina;\r
-        visinaMape = visina;\r
-        Prikaz.funkcijaZaMapu = funkcijaZaMapu;\r
-        pokreni();\r
-    }\r
-\r
-    protected static Map<String, FunkcijaZaPut> funkcijeZaPuteve = new LinkedHashMap<>();\r
-    protected static Map<String, FunkcijaZaVrednostPuta> funkcijeZaVrednostiPuteva = new LinkedHashMap<>();\r
-    protected static Map<String, Paint> bojeZaPuteve = new HashMap<>();\r
-\r
-    @FunctionalInterface\r
-    public static interface FunkcijaZaPut {\r
-        public KorakPuta korak(int indeks);\r
-    }\r
-\r
-    @FunctionalInterface\r
-    public static interface FunkcijaZaVrednostPuta {\r
-        public String vrednost();\r
-    }\r
-\r
-    public static class KorakPuta {\r
-        public int x, y;\r
-    }\r
-\r
-    public static KorakPuta korak(int x, int y) {\r
-        KorakPuta korak = new KorakPuta();\r
-        korak.x = x; korak.y = y;\r
-        return korak;\r
-    }\r
-\r
-    public static void put(String naziv, FunkcijaZaPut funkcijaZaPut, FunkcijaZaVrednostPuta funkcijaZaVrednostPuta, Paint boja) {\r
-        odradiKasnije(() -> {\r
-            funkcijeZaPuteve.remove(naziv);\r
-            funkcijeZaVrednostiPuteva.remove(naziv);\r
-            bojeZaPuteve.remove(naziv);\r
-            listaPuteva.remove(naziv);\r
-            Canvas platno = platnaZaPuteve.remove(naziv);\r
-            centerPane.getChildren().remove(platno);\r
-            if (funkcijaZaPut != null && funkcijaZaVrednostPuta != null && boja != null) {\r
-                funkcijeZaPuteve.put(naziv, funkcijaZaPut);\r
-                funkcijeZaVrednostiPuteva.put(naziv, funkcijaZaVrednostPuta);\r
-                bojeZaPuteve.put(naziv, boja);\r
-                platno = new Canvas(Prikaz.platno.getWidth(), Prikaz.platno.getHeight());\r
-                platno.setOpacity(0.5);\r
-                platno.getGraphicsContext2D().setLineCap(StrokeLineCap.ROUND);\r
-                platno.getGraphicsContext2D().setLineJoin(StrokeLineJoin.ROUND);\r
-                platnaZaPuteve.put(naziv, platno);\r
-                centerPane.getChildren().add(1, platno);\r
-                listaPuteva.add(naziv);\r
-                crtajPut(naziv);\r
-            }\r
-        });\r
-    }\r
-\r
-    public static <T> void put(String naziv, List<T> lista, Function<T, Integer> x, Function<T, Integer> y,  FunkcijaZaVrednostPuta funkcijaZaVrednostPuta, Paint boja) {\r
-        FunkcijaZaPut fja = (int indeks) -> {\r
-            try {\r
-                T element = lista.get(indeks);\r
-                return korak(x.apply(element), y.apply(element));\r
-            } catch (IndexOutOfBoundsException e) {\r
-                return null;\r
-            }\r
-        };\r
-        put(naziv, fja, funkcijaZaVrednostPuta, boja);\r
-    }\r
-\r
-    public static void osveziPut(String naziv) {\r
-        odradiKasnije(() -> {\r
-            crtajPut(naziv);\r
-            listaPuteva.set(listaPuteva.indexOf(naziv), naziv);\r
-        });\r
-        cekajAkoTreba();\r
-    }\r
-\r
-    /////////\r
-    // GUI //\r
-    /////////\r
-\r
-    protected static StackPane centerPane;\r
-    protected static ListView<String> listView;\r
-    protected static ObservableList<String> listaPuteva = FXCollections.observableArrayList();\r
-\r
-    @Override\r
-    public void start(Stage primaryStage) {\r
-        Label labelPutevi = new Label("Putevi:");\r
-        listView = new ListView<>(listaPuteva);\r
-        listView.setCellFactory(l -> new ListCell<String>() {\r
-            public void updateItem(String naziv, boolean empty) {\r
-                super.updateItem(naziv, empty);\r
-                if (empty || naziv == null) {\r
-                    setText(null);\r
-                    setGraphic(null);\r
-                } else {\r
-                    Circle icon = new Circle(8);\r
-                    icon.setFill(bojeZaPuteve.get(naziv));\r
-                    setGraphic(icon);\r
-                    FunkcijaZaVrednostPuta fja = funkcijeZaVrednostiPuteva.get(naziv);\r
-                    try {\r
-                        setText(naziv + ": " + fja.vrednost());\r
-                    } catch (RuntimeException e) {\r
-                    }\r
-                }\r
-            }\r
-        });\r
-\r
-        Label labelAnimacija = new Label();\r
-        Slider slider = new Slider(0, 4, 2);\r
-        Button button = new Button(">");\r
-        osveziPanelZaAnimaciju(labelAnimacija, button, slider.getValue());\r
-        slider.valueProperty().addListener((value, oldValue, newValue) -> {\r
-            osveziPanelZaAnimaciju(labelAnimacija, button, newValue.doubleValue());\r
-        });\r
-        button.setOnAction(e -> {\r
-            zavrsiCekanje();\r
-        });\r
-        button.setMaxHeight(Double.MAX_VALUE);\r
-\r
-        GridPane animationPane = new GridPane();\r
-        animationPane.setHgap(6);\r
-        animationPane.setVgap(6);\r
-        ColumnConstraints column = new ColumnConstraints();\r
-        column.setHgrow(Priority.ALWAYS);\r
-        animationPane.getColumnConstraints().add(column);\r
-        animationPane.add(labelAnimacija, 0, 0);\r
-        animationPane.add(slider, 0, 1);\r
-        animationPane.add(button, 1, 0, 1, 2);\r
-\r
-        VBox rightPane = new VBox();\r
-        rightPane.setPadding(new Insets(12, 12, 12, 12));\r
-        rightPane.setSpacing(6);\r
-        rightPane.getChildren().add(labelPutevi);\r
-        listView.setPrefHeight(0);\r
-        VBox.setVgrow(listView, Priority.ALWAYS);\r
-        rightPane.getChildren().add(listView);\r
-        VBox.setMargin(animationPane, new Insets(6, 0, 0, 0));\r
-        rightPane.getChildren().add(animationPane);\r
-\r
-        platno = new Canvas(ukupnaDuzina(sirinaMape), ukupnaDuzina(visinaMape));\r
-        osveziMapu();\r
-        centerPane = new StackPane(platno);\r
-\r
-        BorderPane rootPane = new BorderPane();\r
-        rootPane.setCenter(centerPane);\r
-        rootPane.setRight(rightPane);\r
-        Scene scene = new Scene(rootPane);\r
-\r
-        primaryStage.setTitle(naslovProzora + " - " + sirinaMape + " x " + visinaMape + "");\r
-        primaryStage.setAlwaysOnTop(true);\r
-        primaryStage.setResizable(false);\r
-        primaryStage.setOnCloseRequest(e -> podesiVreme(0));\r
-        primaryStage.setScene(scene);\r
-        primaryStage.show();\r
-\r
-    }\r
-\r
-    protected static void osveziPanelZaAnimaciju(Label labela, Button dugme, double vrednost) {\r
-        long vreme = podesiVreme(vrednost);\r
-        String tekst = "Brzina animacije: " + String.format("%.2f", vreme / 1000.0) + "s";\r
-        dugme.setVisible(vreme >= 1000);\r
-        labela.setText(tekst);\r
-    }\r
-\r
-    /////////////\r
-    // Crtanje //\r
-    /////////////\r
-\r
-    protected static Canvas platno;\r
-    protected static Map<String, Canvas> platnaZaPuteve = new LinkedHashMap<>();\r
-\r
-    protected static void osveziMapu() {\r
-        crtajMapu(platno.getGraphicsContext2D(), platno.getWidth(), platno.getHeight());\r
-    }\r
-\r
-    protected static void crtajMapu(GraphicsContext gc, double sirina, double visina) {\r
-        gc.setTextAlign(TextAlignment.CENTER);\r
-        gc.setTextBaseline(VPos.CENTER);\r
-        gc.setFont(font);\r
-        crtajOkvir(gc, sirina, visina);\r
-        for (int j = 0; j < visinaMape; j++) {\r
-            for (int i = 0; i < sirinaMape; i++) {\r
-                int sadrzaj = funkcijaZaMapu.vrednostNa(i, j);\r
-                Paint bojaPozadina = bojaPoljaPozadina.get(sadrzaj);\r
-                Paint bojaTekst = bojaPoljaTekst.get(sadrzaj);\r
-                crtajPolje(gc, i, j, bojaPozadina, bojaTekst, "" + sadrzaj);\r
-            }\r
-        }\r
-    }\r
-\r
-    protected static void crtajOkvir(GraphicsContext gc, double sirina, double visina) {\r
-        gc.setFill(bojaPozadine);\r
-        gc.fillRect(0, 0, sirina, visina);\r
-        if (debljinaOkvira <= 0) {\r
-            return;\r
-        }\r
-        gc.setFill(bojaOkvira);\r
-        gc.fillRoundRect(x(-debljinaOkvira), x(-debljinaOkvira), w(sirinaMape + 2 * debljinaOkvira), w(visinaMape + 2 * debljinaOkvira), r(), r());\r
-        gc.setFill(bojaPozadine);\r
-        gc.fillRoundRect(x(-1, 1), x(-1, 1), w(sirinaMape, 2), w(visinaMape, 2), r(), r());\r
-    }\r
-\r
-    protected static void crtajPolje(GraphicsContext gc, int x, int y, Paint bojaPozadina, Paint bojaTekst, String tekst) {\r
-        if (bojaPozadina != null) {\r
-            gc.setFill(bojaPozadina);\r
-            gc.fillRoundRect(x(x), x(y), w(1), w(1), r(), r());\r
-        }\r
-        if (tekst != null && bojaTekst != null) {\r
-            gc.setFill(bojaTekst);\r
-            gc.fillText(tekst, x(x, 0.5), x(y, 0.5));\r
-        }\r
-    }\r
-\r
-    protected static void crtajPut(String naziv) {\r
-        Canvas platno = platnaZaPuteve.get(naziv);\r
-        GraphicsContext gc = platno.getGraphicsContext2D();\r
-        gc.clearRect(0, 0, platno.getWidth(), platno.getHeight());\r
-        FunkcijaZaPut fja = funkcijeZaPuteve.get(naziv);\r
-        Paint boja = bojeZaPuteve.get(naziv);\r
-        double debljina = debljinaPuta;\r
-        List<KorakPuta> koraci = new ArrayList<>();\r
-        int i = 0; KorakPuta korak;\r
-        while ((korak = fja.korak(i++)) != null) {\r
-            koraci.add(korak);\r
-        }\r
-        crtajPut(gc, koraci, boja, debljina);\r
-    }\r
-\r
-    protected static void crtajPut(GraphicsContext gc, List<KorakPuta> koraci, Paint boja, double debljina) {\r
-        gc.setStroke(boja);\r
-        gc.setLineWidth(debljina);\r
-        if (koraci.size() == 1) {\r
-            KorakPuta k = koraci.get(0);\r
-            gc.setFill(boja);\r
-            gc.fillOval(k(k.x) - debljina / 2, k(k.y) - debljina / 2, debljina, debljina);\r
-        }\r
-        for (int j = 1; j < koraci.size(); j++) {\r
-            KorakPuta k1 = koraci.get(j - 1);\r
-            KorakPuta k2 = koraci.get(j);\r
-            gc.strokeLine(k(k1.x), k(k1.y), k(k2.x), k(k2.y));\r
-        }\r
-    }\r
-\r
-    ///////////////\r
-    // Animacija //\r
-    ///////////////\r
-\r
-    protected static boolean nekoCeka = false;\r
-    protected static long vremeCekanja = 1000;\r
-\r
-    protected static synchronized void cekajAkoTreba() {\r
-        long pocetak = System.currentTimeMillis();\r
-        if (vremeCekanja == 0) {\r
-            return;\r
-        }\r
-        nekoCeka = true;\r
-        long vreme;\r
-        boolean bioPrekid = Thread.interrupted();\r
-        while (nekoCeka && (vreme = pocetak + vremeCekanja - System.currentTimeMillis()) > 0) {\r
-            try {\r
-                Prikaz.class.wait(vreme);\r
-            } catch (InterruptedException e) {\r
-                bioPrekid = true;\r
-            }\r
-        }\r
-        if (bioPrekid) {\r
-            Thread.currentThread().interrupt();\r
-        }\r
-        nekoCeka = false;\r
-    }\r
-\r
-    protected static synchronized void podesiVreme(long novoVremeCekanja) {\r
-        vremeCekanja = novoVremeCekanja;\r
-        Prikaz.class.notify();\r
-    }\r
-\r
-    protected static synchronized void zavrsiCekanje() {\r
-        nekoCeka = false;\r
-        Prikaz.class.notify();\r
-    }\r
-\r
-    protected static long podesiVreme(double stepen) {\r
-        stepen = 5 - stepen;\r
-        if (stepen <= 1) {\r
-            podesiVreme(0);\r
-            return 0;\r
-        }\r
-        long vrednost = (long) Math.pow(10, stepen);\r
-        podesiVreme(vrednost);\r
-        return vrednost;\r
-    }\r
-\r
-    ////////////////\r
-    // Pokretanje //\r
-    ////////////////\r
-\r
-    protected static void pokreni() {\r
-        Runnable launcher = () -> {\r
-            launch(new String[] {});\r
-        };\r
-        new Thread(launcher).start();\r
-    }\r
-\r
-    protected static void odradiKasnije(Runnable zadatak) {\r
-        Platform.runLater(zadatak);\r
-    }\r
-}\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Put.java b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/Put.java
deleted file mode 100644 (file)
index e942883..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-import java.util.ArrayList;\r
-import java.util.Collections;\r
-import java.util.List;\r
-\r
-import javafx.scene.paint.Color;\r
-\r
-/**\r
- * Klasa Put koristi se za pamcenje puta kroz mapu.\r
- */\r
-public class Put {\r
-\r
-       // Pamtimo sva polja na putu\r
-       private ArrayList<Polje> polja;\r
-\r
-       // Dodato da se omoguci pristup poljima puta "od spolja" (za proveru kvaliteta puta na primer),\r
-       // ali tako da ne moze da se utice na sam sadrzaj te liste\r
-       private List<Polje> nepromenljivaListaPolja;\r
-\r
-       // Potrebno za graficki prikaz\r
-       private String naziv;\r
-\r
-       // Potrebno za graficki prikaz\r
-       private Put(String naziv, Color boja) {\r
-               polja = new ArrayList<Polje>();\r
-               nepromenljivaListaPolja = Collections.unmodifiableList(polja);\r
-               this.naziv = naziv;\r
-               Prikaz.put(naziv, polja, Polje::getX, Polje::getY, this::toString, boja);\r
-       }\r
-\r
-       // Kreira novo prazno resenje\r
-       public Put() {\r
-               this("Trenutni", Prikaz.TIRKIZNA);\r
-       }\r
-\r
-       // Kreira novo resenje sa istim sadrzajem kao original\r
-       public Put(Put original) {\r
-               this("Optimalan", Prikaz.LJUBICASTA);\r
-               polja.addAll(original.polja);\r
-       }\r
-\r
-       // Dodaje polje u resenje\r
-       public void dodaj(int x, int y, int v) {\r
-               polja.add(new Polje(x, y, v));\r
-               Prikaz.osveziPut(naziv);\r
-       }\r
-\r
-       // Izbacuje poslednje polje iz puta\r
-       public void izbaciKraj() {\r
-               if (getLength() > 0) {\r
-                       polja.remove(getLength() - 1);\r
-                       Prikaz.osveziPut(naziv);\r
-               } else {\r
-                       throw new IllegalStateException("Resenje je vec prazno");\r
-               }\r
-       }\r
-\r
-       // Stampa put\r
-       public void stampaj() {\r
-               System.out.println(getLength());\r
-               for (int i = 0; i < getLength(); i++) {\r
-                       System.out.println(polja.get(i));\r
-               }\r
-               Prikaz.put("Trenutni", null, null, null);\r
-               Prikaz.put("Optimalan", null, null, null);\r
-               Prikaz.put("Najbolji", polja, Polje::getX, Polje::getY, this::toString, Prikaz.LJUBICASTA);\r
-       }\r
-\r
-       public String toString() {\r
-               return getVrednost() + "\u20ac " + getLength() + "m";\r
-       }\r
-\r
-       // Vraca duzinu puta\r
-       public int getLength() {\r
-               return polja.size();\r
-       }\r
-\r
-       // Vraca i-to polje na putu\r
-       // Ne koristi se u ovoj verziji zadatka. Moze se koristiti za proveru kvaliteta resenja\r
-       public Polje getPolje(int i) {\r
-               return polja.get(i);\r
-       }\r
-\r
-       // Vraca sva polja na putu\r
-       // Ne koristi se u ovoj verziji zadatka. Moze se koristiti za proveru kvaliteta resenja\r
-       public List<Polje> getPolja() {\r
-               return nepromenljivaListaPolja;\r
-       }\r
-\r
-       // Vraca vrednost puta\r
-       // Vrednost se definise kao zbir svih vrednosti polja na putu\r
-       public int getVrednost() {\r
-               int rez = 0;\r
-               for (Polje p : polja) {\r
-                       rez = rez + p.getV();\r
-               }\r
-               return rez;\r
-       }\r
-}\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/blago1.txt b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/blago1.txt
deleted file mode 100644 (file)
index 5105c10..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-5 4\r
- 0  0  5  0  0\r
- 0  4 -1  0  0\r
- 0  1 -1 -1 -1\r
- 5  0  0  0 -5\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/blago2.txt b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/blago2.txt
deleted file mode 100644 (file)
index 7bfb346..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-5 5\r
- 0  0  0 -1 -5 \r
- 7 -1  0 -1  0\r
- 0 -1  3  3  5\r
- 0 -1  1 -1  0\r
--1 -1 15  0  0\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/blago3.txt b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/blago3.txt
deleted file mode 100644 (file)
index 28a830e..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-8 9\r
- 0  0  0  4  0  2  0  0\r
--1 -1 -1 -1 -1 -1  0 -1\r
- 0  4  0  3  0  0  0 -1\r
- 0  2  5  1  0  6  0 -1\r
- 0 -1 -1 -1  0  0 12 -1\r
- 0 10 -5  1 -1  0  0 -1\r
--1 -1 -1  0  0  6  0  1\r
- 0 -1 20  0 -1  0 -1  0\r
--1 -1  0  15 0  0 -1 99\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l-prazan.txt b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l-prazan.txt
deleted file mode 100644 (file)
index cc98c8e..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-3 3\r
- 0  0  0\r
- 0  0  0\r
- 0  0 -5\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l1.txt b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l1.txt
deleted file mode 100644 (file)
index 3b92da0..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-5 4\r
- 0  0  0  0  0\r
- 0  0 -1  0  0\r
- 0  0 -1 -1 -1\r
- 0  0  0  0 -5\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l2.txt b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l2.txt
deleted file mode 100644 (file)
index 28796c0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-5 5\r
- 0  0  0 -1 -5 \r
- 0 -1  0 -1  0\r
- 0 -1  0  0  0\r
- 0 -1  0 -1  0\r
--1 -1  0  0  0\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l3.txt b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l3.txt
deleted file mode 100644 (file)
index fb1f4e4..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-8 9\r
- 0  0  0  0  0  0  0  0\r
--1 -1 -1 -1 -1 -1  0 -1\r
- 0  0  0  0  0  0  0 -1\r
- 0  0  0  0  0  0  0 -1\r
- 0 -1 -1 -1  0  0  0 -1\r
- 0  0 -5  0 -1  0  0 -1\r
--1 -1 -1  0  0  0  0  0\r
- 0 -1  0  0 -1  0 -1  0\r
--1 -1  0  0  0  0 -1  0\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l4.txt b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/l4.txt
deleted file mode 100644 (file)
index 444dab5..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-10 10\r
- 0  0  0  0  0  0  0  0  0  0\r
- 0 -1 -1 -1 -1 -1 -1 -1  0 -1\r
- 0 -1  0  0  0  0  0 -1  0 -1\r
- 0 -1  0 -1  0 -1  0 -1  0 -1\r
- 0 -1  0 -1  0 -1  0 -1  0 -1\r
- 0 -1  0  0 -5 -1  0 -1  0 -1\r
- 0  0  0 -1 -1  0  0 -1  0  0\r
- 0  0  0 -1  0  0 -1  0  0  0\r
--1 -1  0 -1  0  0  0  0 -1  0\r
- 0  0  0  0  0  0  0  0 -1  0\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/lav.txt b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/lav.txt
deleted file mode 100644 (file)
index e32db19..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-5 6\r
- 0  0  0 -1 -5\r
- 0 -1  0 -1  0\r
- 0 -1  0  0  0\r
- 0 -1  0 -1  0\r
--1 -1  0  0  0\r
- 0 -1  0  0 -1\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/lavblok.txt b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/lavblok.txt
deleted file mode 100644 (file)
index ee5fe19..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-3 3\r
- 0  0  0\r
- 0 -1 -1\r
- 0 -1 -5\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/readme.txt b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/readme.txt
deleted file mode 100644 (file)
index cb7d47d..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Pri koristicenju programa moguce je koristiti sledece fajlove:\r
-\r
-lav.txt - sadrzi lavirint koji se moze koristiti za proveru da\r
-li postoji put, ispis puta i ispis najkraceg puta.\r
-\r
-lavblok.txt - sadrzi lavirint u kojem ne postoji put\r
-\r
-l1.txt, l2.txt, l3.txt, l4.txt sadrze razlicite resive lavirinte.\r
-\r
-blago1.txt, blago2.txt i blago3.txt - sadrzi lavirinte sa blagom \r
-za testiranje najvrednijeg puta.\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/zadatak-lavirint.txt b/PretrazivanjeSaVracanjem/Lavirint/ObjedinjenoResenje/zadatak-lavirint.txt
deleted file mode 100644 (file)
index 5581283..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-Zadatak - pretrazivanje sa vracanjem - lavirint\r
-============================================================\r
-\r
-Napisati program koji ucitava lavirint iz fajla i nalazi put\r
-ili puteve sa odredjenim osobinama.\r
-\r
-\r
-Format fajla\r
-------------------------------------------------------------\r
-\r
-Lavirint je u fajlu predstavljen na sledeci nacin:\r
-\r
-U prvom redu se nalaze dva broja S i V (1<= S, V <=10), koji\r
-predstavljaju sirinu i visinu lavirinta. U sledecih V redova\r
-se nalaze po S celih brojeva koji predstavljaju lavirint.\r
-Brojevi imaju sledece znacenje:\r
-\r
- 0 - prazno polje\r
--1 - zid, na ovo polje se ne moze stupiti\r
--5 - izlaz iz lavirinta\r
-\r
-Sa jednog polja se moze preci na drugo, ukoliko imaju\r
-zajednicku stranicu, odnosno mozemo preci na polje levo,\r
-desno, gore ili dole.\r
-\r
-Pri ucitavanju pretpostaviti da ukoliko fajl postoji da su\r
-podaci u njemu ispravno zadati.\r
-\r
-\r
-Zadatak\r
-------------------------------------------------------------\r
-\r
-- Napisati program tako da proverava da li postoji put od\r
-pocetnog polja do izlaza iz lavirinta. Pocetno polje je na\r
-koordinatama 1,1, odnosno u gornjem levom uglu.\r
-\r
-- Program prosiriti tako da na ekran ispisuje trazeni put\r
-(ako postoji).\r
-\r
-- Modifikovati program tako da vraca najkraci put do\r
-izlaza.\r
-\r
-- Razmotriti sledecu modifikaciju problema: \r
-\r
-U drevnim lavirintima se nalaze zlatnici razasuti po\r
-poljima. Ovi lavirinti su veoma opasni, pa ih nije\r
-jednostavno pokupiti, vec se to moze raditi samo pomocu\r
-specijalnih robota. Na srecu pronadjene su mape koje\r
-precizno pokazuju kako lavirinti izgledaju, gde su im izlazi\r
-i koliko zlatnika se moze pokupiti na kom polju. Sada treba\r
-naci put kroz lavirint tako da se pokupi sto vise zlatnika,\r
-a da se pri tome ne nagazi na isto polje dva puta.\r
-\r
-Pri ucitavanju lavirinta, bilo koji pozitivan broj\r
-predstavlja broj zlatnika na tom polju. Program treba da\r
-vraca optimalni put do izlaza, odnosno takav da se pokupi\r
-sto vise zlatnika na putu.\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Lavirint.java b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Lavirint.java
new file mode 100644 (file)
index 0000000..5b84e5a
--- /dev/null
@@ -0,0 +1,156 @@
+import java.util.Comparator;\r
+\r
+/**\r
+ * Klasa Lavirint sadrzi 3 javne i tri privatne metode za trazenje puteva.\r
+ *\r
+ * Klase KomparatorPoDuzini i KomparatorPoVrednosti predstavljaju komparatore\r
+ * koji se korste pri trazenju najkraceg i najvrednijeg puta.\r
+ */\r
+public class Lavirint {\r
+\r
+       // Polje m sadrzi kompletnu mapu\r
+       private Mapa m;\r
+\r
+       // Polje optResenje sluzi za pamcenje optimalnog resenja\r
+       private Put optResenje;\r
+\r
+       // Ucitava mapu iz datog fajla i stampa je na ekran\r
+       Lavirint(String imeFajla) {\r
+               m = new Mapa(imeFajla);\r
+               m.stampaj();\r
+       }\r
+\r
+       // Provarava da li postoji put do izlaza i vraca vrednost true\r
+       // ako postoji put ili vrednost false ako ne postoji\r
+       public boolean postojiPut(int x, int y) {\r
+               if (x < 0 || x >= m.getSirina() || y < 0 || y >= m.getVisina()) {\r
+                       return false;\r
+               }\r
+               if (m.getPos(x, y) == true) {\r
+                       return false;\r
+               }\r
+               if (m.getMat(x, y) == Mapa.ZID) {\r
+                       return false;\r
+               }\r
+               if (m.getMat(x, y) == Mapa.IZLAZ) {\r
+                       return true;\r
+               }\r
+               m.setPos(x, y, true);\r
+               if (postojiPut(x + 1, y)) {\r
+                       return true;\r
+               }\r
+               if (postojiPut(x - 1, y)) {\r
+                       return true;\r
+               }\r
+               if (postojiPut(x, y + 1)) {\r
+                       return true;\r
+               }\r
+               if (postojiPut(x, y - 1)) {\r
+                       return true;\r
+               }\r
+               m.setPos(x, y, false);\r
+               return false;\r
+       }\r
+\r
+       // Poziva metodu rput da pronadje i ispise put, ako postoji\r
+       // Ukoliko put ne postoji, ispisuje poruku o gresci\r
+       public void nadjiPut(int x, int y) {\r
+               if (!rput(x, y)) {\r
+                       System.err.println("Ne postoji put");\r
+               }\r
+       }\r
+\r
+       // Proverava da li postoji put korsiteci pretrazivanje sa vracanjem\r
+       // Ukoliko se pronadje izlaz iz lavirinta, stampa se put u obrnutom\r
+       // redosledu\r
+       // Put se stampa pri povratku iz rekurzije\r
+       private boolean rput(int x, int y) {\r
+               if (x < 0 || x >= m.getSirina() || y < 0 || y >= m.getVisina()) {\r
+                       return false;\r
+               }\r
+               if (m.getPos(x, y)) {\r
+                       return false;\r
+               }\r
+               if (m.getMat(x, y) == Mapa.ZID) {\r
+                       return false;\r
+               }\r
+               if (m.getMat(x, y) == Mapa.IZLAZ) {\r
+                       System.out.println(x + " " + y);\r
+                       return true;\r
+               }\r
+               m.setPos(x, y, true);\r
+               if (rput(x + 1, y) || rput(x, y + 1) || rput(x, y - 1)\r
+                               || rput(x - 1, y)) {\r
+                       System.out.println(x + " " + y);\r
+                       return true;\r
+               }\r
+               m.setPos(x, y, false);\r
+               return false;\r
+       }\r
+\r
+       // Kreira optimalno resenje za put, pri cemu se za optimalnost resenja\r
+       // koristi komparator po duzini resenja, tj. trazi se najkrace resenje\r
+       // Samo resenje kreira se u metodi optPut\r
+       public Put najkraciPut(int x, int y) {\r
+               Put r = new Put();\r
+               optPut(x, y, r, new KomparatorPoDuzini());\r
+               return optResenje;\r
+       }\r
+\r
+       // Kreira optimalno resenje za put, pri cemu se za optimalnost resenja\r
+       // koristi komparator po duzini resenja, tj. trazi se najvrednije resenje\r
+       // Samo resenje kreira se u metodi optPut\r
+       public Put najvrednijiPut(int x, int y) {\r
+               Put trenutni = new Put();\r
+               optPut(x, y, trenutni, new KomparatorPoVredosti());\r
+               return optResenje;\r
+       }\r
+\r
+       // Proverava da li postoji put korsiteci pretrazivanje sa vracanjem\r
+       // Ukoliko se pronadje na prvi ili optimalniji put, taj put se pamti u\r
+       // optResenje\r
+       // Optimalnost puta se proverava komparatorom\r
+       private void optPut(int x, int y, Put trenutni, Comparator<Put> c) {\r
+               if (x < 0 || x >= m.getSirina() || y < 0 || y >= m.getVisina()) {\r
+                       return;\r
+               }\r
+               if (m.getPos(x, y)) {\r
+                       return;\r
+               }\r
+               if (m.getMat(x, y) == Mapa.ZID) {\r
+                       return;\r
+               }\r
+               if (m.getMat(x, y) == Mapa.IZLAZ) {\r
+                       trenutni.dodaj(x, y, 0);\r
+                       if (optResenje == null || c.compare(trenutni, optResenje) < 0) {\r
+                               optResenje = new Put(trenutni);\r
+                       }\r
+                       trenutni.izbaciKraj();\r
+                       return;\r
+               }\r
+\r
+               // pokusavamo da trazimo dalje put\r
+               m.setPos(x, y, true);\r
+               trenutni.dodaj(x, y, m.getMat(x, y));\r
+               optPut(x + 1, y, trenutni, c);\r
+               optPut(x, y + 1, trenutni, c);\r
+               optPut(x, y - 1, trenutni, c);\r
+               optPut(x - 1, y, trenutni, c);\r
+               m.setPos(x, y, false);\r
+               trenutni.izbaciKraj();\r
+       }\r
+}\r
+\r
+// Komparator za puteve  po duzini resenja\r
+class KomparatorPoDuzini implements Comparator<Put> {\r
+       public int compare(Put r1, Put r2) {\r
+               return r1.getLength() - r2.getLength();\r
+       }\r
+}\r
+\r
+// Komparator za puteve po vrednosti resenja\r
+class KomparatorPoVredosti implements Comparator<Put> {\r
+       public int compare(Put r1, Put r2) {\r
+               return r2.getVrednost() - r1.getVrednost();\r
+       }\r
+}\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/LavirintProgram.java b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/LavirintProgram.java
new file mode 100644 (file)
index 0000000..01adf52
--- /dev/null
@@ -0,0 +1,71 @@
+/**\r
+ * Program za nalazenje puta u lavirintu.\r
+ * \r
+ * Date su cetiri varijante problema, od jednostavnijih ka slozenijima, radi\r
+ * ilustracije osnovnih koncepata i postepenog uvodjenja novih.\r
+ * \r
+ * Najjednostavnije je samo nalazenje da li put postoji.\r
+ * \r
+ * Prosirenje tog resenja nam ispisuje taj nadjeni put.\r
+ * \r
+ * Treca varijanta nalazi sve puteve i medju njima bira najkraci.\r
+ * \r
+ * Cetvrta varijanta resava lavirint u kome su rasuti zlatnici na poljima i\r
+ * nalazi put na kome se kupi najvise zlatnika.\r
+ */\r
+\r
+public class LavirintProgram {\r
+\r
+       public static void main(String[] args) {\r
+               Svetovid.out.println("Unesite ime fajla: ");\r
+               String fajl = Svetovid.in.readLine();\r
+               if (!Svetovid.testIn(fajl)) {\r
+                       System.out.println("Greska: nema fajla!");\r
+                       return;\r
+               }\r
+\r
+               Lavirint l = new Lavirint(fajl);\r
+               Put r;\r
+\r
+               if (l != null) {\r
+                       System.out.println("1 - da li postoji put");\r
+                       System.out.println("2 - ispis nekog puta (ako postoji)");\r
+                       System.out.println("3 - nalazenje najkraceg puta");\r
+                       System.out.println("4 - nalazenje najvrednijeg puta");\r
+                       System.out.println("Unesite izbor 1-4:");\r
+                       int op = Svetovid.in.readInt();\r
+\r
+                       switch (op) {\r
+                       case 1:\r
+                               if (l.postojiPut(0, 0)) {\r
+                                       System.out.println("Postoji put");\r
+                               } else {\r
+                                       System.out.println("Ne postoji put");\r
+                               }\r
+                               break;\r
+                       case 2:\r
+                               l.nadjiPut(0, 0);\r
+                               break;\r
+                       case 3:\r
+                               r = l.najkraciPut(0, 0);\r
+                               if (r != null) {\r
+                                       r.stampaj();\r
+                               } else {\r
+                                       System.out.println("Nema resenja");\r
+                               }\r
+                               break;\r
+                       case 4:\r
+                               r = l.najvrednijiPut(0, 0);\r
+                               if (r != null) {\r
+                                       r.stampaj();\r
+                                       System.out.println("Vrednost puta: " + r.getVrednost());\r
+                               } else {\r
+                                       System.out.println("Nema resenja");\r
+                               }\r
+                               break;\r
+                       default:\r
+                               System.err.println("Uneli ste pogresan izbor");\r
+                       }\r
+               }\r
+       }\r
+}
\ No newline at end of file
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Mapa.java b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Mapa.java
new file mode 100644 (file)
index 0000000..a39c662
--- /dev/null
@@ -0,0 +1,94 @@
+\r
+/**\r
+ * Klasa Mapa koristi se za reprezentaciju lavirint i njegovih polja.\r
+ */\r
+public class Mapa {\r
+\r
+       // Vrednosti polja i njihova znacenja\r
+       public final static int IZLAZ = -5;\r
+       public final static int ZID = -1;\r
+       public final static int GRESKA = Integer.MIN_VALUE;\r
+\r
+       // Dimenzije mape\r
+       private int visina, sirina;\r
+       \r
+       // Polja mape\r
+       private int[][] mat;\r
+\r
+       // Prilikom pretrazivanja ovde mozemo pamtiti koja polja smo posetili a koja nismo\r
+       private boolean[][] pos;\r
+\r
+       public int getSirina() {\r
+               return sirina;\r
+       }\r
+\r
+       public int getVisina() {\r
+               return visina;\r
+       }\r
+\r
+       public void setPos(int x, int y, boolean b) {\r
+               if (0 <= x && x < sirina && 0 <= y && y < visina) {\r
+                       pos[x][y] = b;\r
+               }\r
+       }\r
+\r
+       public boolean getPos(int x, int y) {\r
+               if (0 <= x && x < sirina && 0 <= y && y < visina) {\r
+                       return pos[x][y];\r
+               } else {\r
+                       return true;\r
+               }\r
+       }\r
+\r
+       public int getMat(int x, int y) {\r
+               if (0 <= x && x < sirina && 0 <= y && y < visina) {\r
+                       return mat[x][y];\r
+               } else {\r
+                       return GRESKA;\r
+               }\r
+       }\r
+\r
+       public Mapa(int sirina, int visina) {\r
+               this.sirina = sirina;\r
+               this.visina = visina;\r
+               mat = new int[sirina][visina];\r
+               pos = new boolean[sirina][visina];\r
+       }\r
+\r
+       public Mapa(String imeFajla) {\r
+               if (!Svetovid.testIn(imeFajla)) {\r
+                       throw new RuntimeException("Fajl za kreiranje mape (" + imeFajla + ") nije prisupacan");\r
+               }\r
+               sirina = Svetovid.in(imeFajla).readInt();\r
+               visina = Svetovid.in(imeFajla).readInt();\r
+               mat = new int[sirina][visina];\r
+               pos = new boolean[sirina][visina];\r
+               for (int j = 0; j < visina; j++) {\r
+                       for (int i = 0; i < sirina; i++) {\r
+                               mat[i][j] = Svetovid.in(imeFajla).readInt();\r
+                       }\r
+               }\r
+               Svetovid.closeIn(imeFajla);\r
+               Prikaz.boja(ZID, Prikaz.CRNA, null);\r
+               Prikaz.boja(IZLAZ, Prikaz.CRVENA, Prikaz.BELA);\r
+               Prikaz.boja(1, 20, Prikaz.SVETLO_ZELENA, Prikaz.ZELENA, Prikaz.CRNA);\r
+               Prikaz.boja(99, Prikaz.ZUTA, Prikaz.CRNA);\r
+               Prikaz.mapa("Lavirint", getSirina(), getVisina(), this::getMat);\r
+       }\r
+\r
+       public void stampaj() {\r
+               if (visina != 0 && sirina != 0) {\r
+                       System.out.println(visina + " " + sirina);\r
+                       for (int j = 0; j < visina; j++) {\r
+                               for (int i = 0; i < sirina; i++) {\r
+                                       System.out.print(mat[i][j] + "\t");\r
+                               }\r
+                               System.out.println();\r
+                       }\r
+               }\r
+       }\r
+       \r
+       public String toString() {\r
+               return "Mapa velicine " + sirina + " x " + visina;\r
+       }\r
+}\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Polje.java b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Polje.java
new file mode 100644 (file)
index 0000000..15676d1
--- /dev/null
@@ -0,0 +1,30 @@
+/**\r
+ * Klasa Polje se koristi za pamcenje x i y koordinata nekog polja, kao i\r
+ * vrednosti na toj poziciji u mapi\r
+ */\r
+public class Polje {\r
+\r
+       private final int x, y, v;\r
+\r
+       public Polje(int x, int y, int v) {\r
+               this.x = x;\r
+               this.y = y;\r
+               this.v = v;\r
+       }\r
+\r
+       public int getX() {\r
+               return x;\r
+       }\r
+\r
+       public int getY() {\r
+               return y;\r
+       }\r
+\r
+       public int getV() {\r
+               return v;\r
+       }\r
+\r
+       public String toString() {\r
+               return "(" + x + ", " + y + ") " + v;\r
+       }\r
+}\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Prikaz.java b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Prikaz.java
new file mode 100644 (file)
index 0000000..aa95160
--- /dev/null
@@ -0,0 +1,487 @@
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.LinkedHashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.function.Function;\r
+\r
+import javafx.application.Application;\r
+import javafx.application.Platform;\r
+import javafx.collections.FXCollections;\r
+import javafx.collections.ObservableList;\r
+import javafx.geometry.Insets;\r
+import javafx.geometry.VPos;\r
+import javafx.scene.Scene;\r
+import javafx.scene.canvas.Canvas;\r
+import javafx.scene.canvas.GraphicsContext;\r
+import javafx.scene.control.Button;\r
+import javafx.scene.control.Label;\r
+import javafx.scene.control.ListCell;\r
+import javafx.scene.control.ListView;\r
+import javafx.scene.control.Slider;\r
+import javafx.scene.layout.BorderPane;\r
+import javafx.scene.layout.ColumnConstraints;\r
+import javafx.scene.layout.GridPane;\r
+import javafx.scene.layout.Priority;\r
+import javafx.scene.layout.StackPane;\r
+import javafx.scene.layout.VBox;\r
+import javafx.scene.paint.Color;\r
+import javafx.scene.paint.Paint;\r
+import javafx.scene.shape.Circle;\r
+import javafx.scene.shape.StrokeLineCap;\r
+import javafx.scene.shape.StrokeLineJoin;\r
+import javafx.scene.text.Font;\r
+import javafx.scene.text.FontWeight;\r
+import javafx.scene.text.TextAlignment;\r
+import javafx.stage.Stage;\r
+\r
+public class Prikaz extends Application {\r
+\r
+    public static final Color STVARNO_BELA = Color.hsb(0, 0, 1.0);\r
+    public static final Color BELA         = Color.hsb(0, 0, 0.95);\r
+    public static final Color SVETLO_SIVA  = Color.hsb(0, 0, 0.8);\r
+    public static final Color SIVA         = Color.hsb(0, 0, 0.6);\r
+    public static final Color TAMNO_SIVA   = Color.hsb(0, 0, 0.4);\r
+    public static final Color CRNA         = Color.hsb(0, 0, 0.2);\r
+    public static final Color STVARNO_CRNA = Color.hsb(0, 0, 0.0);\r
+\r
+    public static final Color SVETLO_CRVENA      = Color.hsb(  0, 0.2, 1.0);\r
+    public static final Color SVETLO_NARANDZASTA = Color.hsb( 30, 0.2, 1.0);\r
+    public static final Color SVETLO_ZUTA        = Color.hsb( 60, 0.2, 1.0);\r
+    public static final Color SVETLO_ZELENA      = Color.hsb(120, 0.2, 1.0);\r
+    public static final Color SVETLO_TIRKIZNA    = Color.hsb(180, 0.2, 1.0);\r
+    public static final Color SVETLO_AZURNA      = Color.hsb(210, 0.2, 1.0);\r
+    public static final Color SVETLO_PLAVA       = Color.hsb(240, 0.2, 1.0);\r
+    public static final Color SVETLO_PURPURNA    = Color.hsb(270, 0.2, 1.0);\r
+    public static final Color SVETLO_LJUBICASTA  = Color.hsb(300, 0.2, 1.0);\r
+    public static final Color SVETLO_RUZICASTA   = Color.hsb(330, 0.2, 1.0);\r
+\r
+    public static final Color CRVENA      = Color.hsb(  0, 0.9, 0.8);\r
+    public static final Color NARANDZASTA = Color.hsb( 30, 0.9, 0.8);\r
+    public static final Color ZUTA        = Color.hsb( 60, 0.9, 0.8);\r
+    public static final Color ZELENA      = Color.hsb(120, 0.9, 0.8);\r
+    public static final Color TIRKIZNA    = Color.hsb(180, 0.9, 0.8);\r
+    public static final Color AZURNA      = Color.hsb(210, 0.9, 0.8);\r
+    public static final Color PLAVA       = Color.hsb(240, 0.9, 0.8);\r
+    public static final Color PURPURNA    = Color.hsb(270, 0.9, 0.8);\r
+    public static final Color LJUBICASTA  = Color.hsb(300, 0.9, 0.8);\r
+    public static final Color RUZICASTA   = Color.hsb(330, 0.9, 0.8);\r
+\r
+    public static final Color TAMNO_CRVENA      = Color.hsb(  0, 0.8, 0.4);\r
+    public static final Color TAMNO_NARANDZASTA = Color.hsb( 30, 0.8, 0.4);\r
+    public static final Color TAMNO_ZUTA        = Color.hsb( 60, 0.8, 0.4);\r
+    public static final Color TAMNO_ZELENA      = Color.hsb(120, 0.8, 0.4);\r
+    public static final Color TAMNO_TIRKIZNA    = Color.hsb(180, 0.8, 0.4);\r
+    public static final Color TAMNO_AZURNA      = Color.hsb(210, 0.8, 0.4);\r
+    public static final Color TAMNO_PLAVA       = Color.hsb(240, 0.8, 0.4);\r
+    public static final Color TAMNO_PURPURNA    = Color.hsb(270, 0.8, 0.4);\r
+    public static final Color TAMNO_LJUBICASTA  = Color.hsb(300, 0.8, 0.4);\r
+    public static final Color TAMNO_RUZICASTA   = Color.hsb(330, 0.8, 0.4);\r
+\r
+    ////////////////////\r
+    // Boje i stilovi //\r
+    ////////////////////\r
+\r
+    protected static Paint bojaPozadine = BELA;\r
+    protected static Paint bojaOkvira = CRNA;\r
+    protected static Map<Integer, Paint> bojaPoljaPozadina = new HashMap<>();\r
+    protected static Map<Integer, Paint> bojaPoljaTekst = new HashMap<>();\r
+    protected static Font font = Font.font("Arial", FontWeight.BOLD, 12);\r
+\r
+    public static void boja(Paint pozadina, Paint okvir) {\r
+        bojaPozadine = pozadina;\r
+        bojaOkvira = okvir;\r
+    }\r
+\r
+    public static void boja(int vrednost, Paint bojaPozadine, Paint bojaTeksta) {\r
+        if (bojaPozadine == null) {\r
+            bojaPoljaPozadina.remove(vrednost);\r
+        }\r
+        bojaPoljaPozadina.put(vrednost, bojaPozadine);\r
+        if (bojaTeksta == null) {\r
+            bojaPoljaTekst.remove(vrednost);\r
+        }\r
+        bojaPoljaTekst.put(vrednost, bojaTeksta);\r
+    }\r
+\r
+    public static void boja(int vrednostMin, int vrednostMax, Color bojaMin, Color bojaMax, Paint bojaTeksta) {\r
+        if (bojaMin == null || bojaMax == null) {\r
+            throw new IllegalArgumentException();\r
+        }\r
+        int n = vrednostMax - vrednostMin;\r
+        for (int i = 0; i <= n; i++) {\r
+            int vrednost = vrednostMin + i;\r
+            bojaPoljaPozadina.put(vrednost, bojaMin.interpolate(bojaMax, (double) (i) / n));\r
+            if (bojaTeksta == null) {\r
+                bojaPoljaTekst.remove(vrednost);\r
+            }\r
+            bojaPoljaTekst.put(vrednost, bojaTeksta);\r
+        }\r
+    }\r
+\r
+    ////////////////\r
+    // Geometrija //\r
+    ////////////////\r
+\r
+    private static double velicinaPolja = 32;\r
+    private static double velicinaRazmaka = 4;\r
+    private static int debljinaOkvira = 0;\r
+    private static double debljinaPuta = velicinaPolja / 2;\r
+\r
+    public static void velicina(double polje, double razmak, int okvir) {\r
+        velicinaPolja = polje;\r
+        velicinaRazmaka = razmak;\r
+        debljinaOkvira = okvir;\r
+        debljinaPuta = velicinaPolja / 2;\r
+    }\r
+\r
+    protected static double ukupnaDuzina(int brojPolja) {\r
+        return x(brojPolja + debljinaOkvira, 0.0);\r
+    }\r
+\r
+    protected static double x(int indeks, double delta) {\r
+        indeks = indeks + debljinaOkvira;\r
+        return indeks * (velicinaPolja + velicinaRazmaka) + velicinaRazmaka + velicinaPolja * delta;\r
+    }\r
+\r
+    protected static double x(int indeks) {\r
+        return x(indeks, 0.0);\r
+    }\r
+\r
+    protected static double k(int indeks) {\r
+        return x(indeks, 0.5);\r
+    }\r
+\r
+    protected static double w(int count, double delta) {\r
+        return (velicinaPolja + velicinaRazmaka) * count + velicinaRazmaka * (delta - 1);\r
+    }\r
+\r
+    protected static double w(int count) {\r
+        return w(count, 0);\r
+    }\r
+\r
+    protected static double r() {\r
+        return 2 * velicinaRazmaka;\r
+    }\r
+\r
+    /////////////\r
+    // Sadrzaj //\r
+    /////////////\r
+\r
+    protected static String naslovProzora;\r
+    protected static int sirinaMape;\r
+    protected static int visinaMape;\r
+    protected static FunkcijaZaMapu funkcijaZaMapu;\r
+\r
+    @FunctionalInterface\r
+    public static interface FunkcijaZaMapu {\r
+        public int vrednostNa(int x, int y);\r
+    }\r
+\r
+    public static void mapa(String naslov, int sirina, int visina, FunkcijaZaMapu funkcijaZaMapu) {\r
+        naslovProzora = naslov;\r
+        sirinaMape = sirina;\r
+        visinaMape = visina;\r
+        Prikaz.funkcijaZaMapu = funkcijaZaMapu;\r
+        pokreni();\r
+    }\r
+\r
+    protected static Map<String, FunkcijaZaPut> funkcijeZaPuteve = new LinkedHashMap<>();\r
+    protected static Map<String, FunkcijaZaVrednostPuta> funkcijeZaVrednostiPuteva = new LinkedHashMap<>();\r
+    protected static Map<String, Paint> bojeZaPuteve = new HashMap<>();\r
+\r
+    @FunctionalInterface\r
+    public static interface FunkcijaZaPut {\r
+        public KorakPuta korak(int indeks);\r
+    }\r
+\r
+    @FunctionalInterface\r
+    public static interface FunkcijaZaVrednostPuta {\r
+        public String vrednost();\r
+    }\r
+\r
+    public static class KorakPuta {\r
+        public int x, y;\r
+    }\r
+\r
+    public static KorakPuta korak(int x, int y) {\r
+        KorakPuta korak = new KorakPuta();\r
+        korak.x = x; korak.y = y;\r
+        return korak;\r
+    }\r
+\r
+    public static void put(String naziv, FunkcijaZaPut funkcijaZaPut, FunkcijaZaVrednostPuta funkcijaZaVrednostPuta, Paint boja) {\r
+        odradiKasnije(() -> {\r
+            funkcijeZaPuteve.remove(naziv);\r
+            funkcijeZaVrednostiPuteva.remove(naziv);\r
+            bojeZaPuteve.remove(naziv);\r
+            listaPuteva.remove(naziv);\r
+            Canvas platno = platnaZaPuteve.remove(naziv);\r
+            centerPane.getChildren().remove(platno);\r
+            if (funkcijaZaPut != null && funkcijaZaVrednostPuta != null && boja != null) {\r
+                funkcijeZaPuteve.put(naziv, funkcijaZaPut);\r
+                funkcijeZaVrednostiPuteva.put(naziv, funkcijaZaVrednostPuta);\r
+                bojeZaPuteve.put(naziv, boja);\r
+                platno = new Canvas(Prikaz.platno.getWidth(), Prikaz.platno.getHeight());\r
+                platno.setOpacity(0.5);\r
+                platno.getGraphicsContext2D().setLineCap(StrokeLineCap.ROUND);\r
+                platno.getGraphicsContext2D().setLineJoin(StrokeLineJoin.ROUND);\r
+                platnaZaPuteve.put(naziv, platno);\r
+                centerPane.getChildren().add(1, platno);\r
+                listaPuteva.add(naziv);\r
+                crtajPut(naziv);\r
+            }\r
+        });\r
+    }\r
+\r
+    public static <T> void put(String naziv, List<T> lista, Function<T, Integer> x, Function<T, Integer> y,  FunkcijaZaVrednostPuta funkcijaZaVrednostPuta, Paint boja) {\r
+        FunkcijaZaPut fja = (int indeks) -> {\r
+            try {\r
+                T element = lista.get(indeks);\r
+                return korak(x.apply(element), y.apply(element));\r
+            } catch (IndexOutOfBoundsException e) {\r
+                return null;\r
+            }\r
+        };\r
+        put(naziv, fja, funkcijaZaVrednostPuta, boja);\r
+    }\r
+\r
+    public static void osveziPut(String naziv) {\r
+        odradiKasnije(() -> {\r
+            crtajPut(naziv);\r
+            listaPuteva.set(listaPuteva.indexOf(naziv), naziv);\r
+        });\r
+        cekajAkoTreba();\r
+    }\r
+\r
+    /////////\r
+    // GUI //\r
+    /////////\r
+\r
+    protected static StackPane centerPane;\r
+    protected static ListView<String> listView;\r
+    protected static ObservableList<String> listaPuteva = FXCollections.observableArrayList();\r
+\r
+    @Override\r
+    public void start(Stage primaryStage) {\r
+        Label labelPutevi = new Label("Putevi:");\r
+        listView = new ListView<>(listaPuteva);\r
+        listView.setCellFactory(l -> new ListCell<String>() {\r
+            public void updateItem(String naziv, boolean empty) {\r
+                super.updateItem(naziv, empty);\r
+                if (empty || naziv == null) {\r
+                    setText(null);\r
+                    setGraphic(null);\r
+                } else {\r
+                    Circle icon = new Circle(8);\r
+                    icon.setFill(bojeZaPuteve.get(naziv));\r
+                    setGraphic(icon);\r
+                    FunkcijaZaVrednostPuta fja = funkcijeZaVrednostiPuteva.get(naziv);\r
+                    try {\r
+                        setText(naziv + ": " + fja.vrednost());\r
+                    } catch (RuntimeException e) {\r
+                    }\r
+                }\r
+            }\r
+        });\r
+\r
+        Label labelAnimacija = new Label();\r
+        Slider slider = new Slider(0, 4, 2);\r
+        Button button = new Button(">");\r
+        osveziPanelZaAnimaciju(labelAnimacija, button, slider.getValue());\r
+        slider.valueProperty().addListener((value, oldValue, newValue) -> {\r
+            osveziPanelZaAnimaciju(labelAnimacija, button, newValue.doubleValue());\r
+        });\r
+        button.setOnAction(e -> {\r
+            zavrsiCekanje();\r
+        });\r
+        button.setMaxHeight(Double.MAX_VALUE);\r
+\r
+        GridPane animationPane = new GridPane();\r
+        animationPane.setHgap(6);\r
+        animationPane.setVgap(6);\r
+        ColumnConstraints column = new ColumnConstraints();\r
+        column.setHgrow(Priority.ALWAYS);\r
+        animationPane.getColumnConstraints().add(column);\r
+        animationPane.add(labelAnimacija, 0, 0);\r
+        animationPane.add(slider, 0, 1);\r
+        animationPane.add(button, 1, 0, 1, 2);\r
+\r
+        VBox rightPane = new VBox();\r
+        rightPane.setPadding(new Insets(12, 12, 12, 12));\r
+        rightPane.setSpacing(6);\r
+        rightPane.getChildren().add(labelPutevi);\r
+        listView.setPrefHeight(0);\r
+        VBox.setVgrow(listView, Priority.ALWAYS);\r
+        rightPane.getChildren().add(listView);\r
+        VBox.setMargin(animationPane, new Insets(6, 0, 0, 0));\r
+        rightPane.getChildren().add(animationPane);\r
+\r
+        platno = new Canvas(ukupnaDuzina(sirinaMape), ukupnaDuzina(visinaMape));\r
+        osveziMapu();\r
+        centerPane = new StackPane(platno);\r
+\r
+        BorderPane rootPane = new BorderPane();\r
+        rootPane.setCenter(centerPane);\r
+        rootPane.setRight(rightPane);\r
+        Scene scene = new Scene(rootPane);\r
+\r
+        primaryStage.setTitle(naslovProzora + " - " + sirinaMape + " x " + visinaMape + "");\r
+        primaryStage.setAlwaysOnTop(true);\r
+        primaryStage.setResizable(false);\r
+        primaryStage.setOnCloseRequest(e -> podesiVreme(0));\r
+        primaryStage.setScene(scene);\r
+        primaryStage.show();\r
+\r
+    }\r
+\r
+    protected static void osveziPanelZaAnimaciju(Label labela, Button dugme, double vrednost) {\r
+        long vreme = podesiVreme(vrednost);\r
+        String tekst = "Brzina animacije: " + String.format("%.2f", vreme / 1000.0) + "s";\r
+        dugme.setVisible(vreme >= 1000);\r
+        labela.setText(tekst);\r
+    }\r
+\r
+    /////////////\r
+    // Crtanje //\r
+    /////////////\r
+\r
+    protected static Canvas platno;\r
+    protected static Map<String, Canvas> platnaZaPuteve = new LinkedHashMap<>();\r
+\r
+    protected static void osveziMapu() {\r
+        crtajMapu(platno.getGraphicsContext2D(), platno.getWidth(), platno.getHeight());\r
+    }\r
+\r
+    protected static void crtajMapu(GraphicsContext gc, double sirina, double visina) {\r
+        gc.setTextAlign(TextAlignment.CENTER);\r
+        gc.setTextBaseline(VPos.CENTER);\r
+        gc.setFont(font);\r
+        crtajOkvir(gc, sirina, visina);\r
+        for (int j = 0; j < visinaMape; j++) {\r
+            for (int i = 0; i < sirinaMape; i++) {\r
+                int sadrzaj = funkcijaZaMapu.vrednostNa(i, j);\r
+                Paint bojaPozadina = bojaPoljaPozadina.get(sadrzaj);\r
+                Paint bojaTekst = bojaPoljaTekst.get(sadrzaj);\r
+                crtajPolje(gc, i, j, bojaPozadina, bojaTekst, "" + sadrzaj);\r
+            }\r
+        }\r
+    }\r
+\r
+    protected static void crtajOkvir(GraphicsContext gc, double sirina, double visina) {\r
+        gc.setFill(bojaPozadine);\r
+        gc.fillRect(0, 0, sirina, visina);\r
+        if (debljinaOkvira <= 0) {\r
+            return;\r
+        }\r
+        gc.setFill(bojaOkvira);\r
+        gc.fillRoundRect(x(-debljinaOkvira), x(-debljinaOkvira), w(sirinaMape + 2 * debljinaOkvira), w(visinaMape + 2 * debljinaOkvira), r(), r());\r
+        gc.setFill(bojaPozadine);\r
+        gc.fillRoundRect(x(-1, 1), x(-1, 1), w(sirinaMape, 2), w(visinaMape, 2), r(), r());\r
+    }\r
+\r
+    protected static void crtajPolje(GraphicsContext gc, int x, int y, Paint bojaPozadina, Paint bojaTekst, String tekst) {\r
+        if (bojaPozadina != null) {\r
+            gc.setFill(bojaPozadina);\r
+            gc.fillRoundRect(x(x), x(y), w(1), w(1), r(), r());\r
+        }\r
+        if (tekst != null && bojaTekst != null) {\r
+            gc.setFill(bojaTekst);\r
+            gc.fillText(tekst, x(x, 0.5), x(y, 0.5));\r
+        }\r
+    }\r
+\r
+    protected static void crtajPut(String naziv) {\r
+        Canvas platno = platnaZaPuteve.get(naziv);\r
+        GraphicsContext gc = platno.getGraphicsContext2D();\r
+        gc.clearRect(0, 0, platno.getWidth(), platno.getHeight());\r
+        FunkcijaZaPut fja = funkcijeZaPuteve.get(naziv);\r
+        Paint boja = bojeZaPuteve.get(naziv);\r
+        double debljina = debljinaPuta;\r
+        List<KorakPuta> koraci = new ArrayList<>();\r
+        int i = 0; KorakPuta korak;\r
+        while ((korak = fja.korak(i++)) != null) {\r
+            koraci.add(korak);\r
+        }\r
+        crtajPut(gc, koraci, boja, debljina);\r
+    }\r
+\r
+    protected static void crtajPut(GraphicsContext gc, List<KorakPuta> koraci, Paint boja, double debljina) {\r
+        gc.setStroke(boja);\r
+        gc.setLineWidth(debljina);\r
+        if (koraci.size() == 1) {\r
+            KorakPuta k = koraci.get(0);\r
+            gc.setFill(boja);\r
+            gc.fillOval(k(k.x) - debljina / 2, k(k.y) - debljina / 2, debljina, debljina);\r
+        }\r
+        for (int j = 1; j < koraci.size(); j++) {\r
+            KorakPuta k1 = koraci.get(j - 1);\r
+            KorakPuta k2 = koraci.get(j);\r
+            gc.strokeLine(k(k1.x), k(k1.y), k(k2.x), k(k2.y));\r
+        }\r
+    }\r
+\r
+    ///////////////\r
+    // Animacija //\r
+    ///////////////\r
+\r
+    protected static boolean nekoCeka = false;\r
+    protected static long vremeCekanja = 1000;\r
+\r
+    protected static synchronized void cekajAkoTreba() {\r
+        long pocetak = System.currentTimeMillis();\r
+        if (vremeCekanja == 0) {\r
+            return;\r
+        }\r
+        nekoCeka = true;\r
+        long vreme;\r
+        boolean bioPrekid = Thread.interrupted();\r
+        while (nekoCeka && (vreme = pocetak + vremeCekanja - System.currentTimeMillis()) > 0) {\r
+            try {\r
+                Prikaz.class.wait(vreme);\r
+            } catch (InterruptedException e) {\r
+                bioPrekid = true;\r
+            }\r
+        }\r
+        if (bioPrekid) {\r
+            Thread.currentThread().interrupt();\r
+        }\r
+        nekoCeka = false;\r
+    }\r
+\r
+    protected static synchronized void podesiVreme(long novoVremeCekanja) {\r
+        vremeCekanja = novoVremeCekanja;\r
+        Prikaz.class.notify();\r
+    }\r
+\r
+    protected static synchronized void zavrsiCekanje() {\r
+        nekoCeka = false;\r
+        Prikaz.class.notify();\r
+    }\r
+\r
+    protected static long podesiVreme(double stepen) {\r
+        stepen = 5 - stepen;\r
+        if (stepen <= 1) {\r
+            podesiVreme(0);\r
+            return 0;\r
+        }\r
+        long vrednost = (long) Math.pow(10, stepen);\r
+        podesiVreme(vrednost);\r
+        return vrednost;\r
+    }\r
+\r
+    ////////////////\r
+    // Pokretanje //\r
+    ////////////////\r
+\r
+    protected static void pokreni() {\r
+        Runnable launcher = () -> {\r
+            launch(new String[] {});\r
+        };\r
+        new Thread(launcher).start();\r
+    }\r
+\r
+    protected static void odradiKasnije(Runnable zadatak) {\r
+        Platform.runLater(zadatak);\r
+    }\r
+}\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Put.java b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/Put.java
new file mode 100644 (file)
index 0000000..e942883
--- /dev/null
@@ -0,0 +1,98 @@
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.List;\r
+\r
+import javafx.scene.paint.Color;\r
+\r
+/**\r
+ * Klasa Put koristi se za pamcenje puta kroz mapu.\r
+ */\r
+public class Put {\r
+\r
+       // Pamtimo sva polja na putu\r
+       private ArrayList<Polje> polja;\r
+\r
+       // Dodato da se omoguci pristup poljima puta "od spolja" (za proveru kvaliteta puta na primer),\r
+       // ali tako da ne moze da se utice na sam sadrzaj te liste\r
+       private List<Polje> nepromenljivaListaPolja;\r
+\r
+       // Potrebno za graficki prikaz\r
+       private String naziv;\r
+\r
+       // Potrebno za graficki prikaz\r
+       private Put(String naziv, Color boja) {\r
+               polja = new ArrayList<Polje>();\r
+               nepromenljivaListaPolja = Collections.unmodifiableList(polja);\r
+               this.naziv = naziv;\r
+               Prikaz.put(naziv, polja, Polje::getX, Polje::getY, this::toString, boja);\r
+       }\r
+\r
+       // Kreira novo prazno resenje\r
+       public Put() {\r
+               this("Trenutni", Prikaz.TIRKIZNA);\r
+       }\r
+\r
+       // Kreira novo resenje sa istim sadrzajem kao original\r
+       public Put(Put original) {\r
+               this("Optimalan", Prikaz.LJUBICASTA);\r
+               polja.addAll(original.polja);\r
+       }\r
+\r
+       // Dodaje polje u resenje\r
+       public void dodaj(int x, int y, int v) {\r
+               polja.add(new Polje(x, y, v));\r
+               Prikaz.osveziPut(naziv);\r
+       }\r
+\r
+       // Izbacuje poslednje polje iz puta\r
+       public void izbaciKraj() {\r
+               if (getLength() > 0) {\r
+                       polja.remove(getLength() - 1);\r
+                       Prikaz.osveziPut(naziv);\r
+               } else {\r
+                       throw new IllegalStateException("Resenje je vec prazno");\r
+               }\r
+       }\r
+\r
+       // Stampa put\r
+       public void stampaj() {\r
+               System.out.println(getLength());\r
+               for (int i = 0; i < getLength(); i++) {\r
+                       System.out.println(polja.get(i));\r
+               }\r
+               Prikaz.put("Trenutni", null, null, null);\r
+               Prikaz.put("Optimalan", null, null, null);\r
+               Prikaz.put("Najbolji", polja, Polje::getX, Polje::getY, this::toString, Prikaz.LJUBICASTA);\r
+       }\r
+\r
+       public String toString() {\r
+               return getVrednost() + "\u20ac " + getLength() + "m";\r
+       }\r
+\r
+       // Vraca duzinu puta\r
+       public int getLength() {\r
+               return polja.size();\r
+       }\r
+\r
+       // Vraca i-to polje na putu\r
+       // Ne koristi se u ovoj verziji zadatka. Moze se koristiti za proveru kvaliteta resenja\r
+       public Polje getPolje(int i) {\r
+               return polja.get(i);\r
+       }\r
+\r
+       // Vraca sva polja na putu\r
+       // Ne koristi se u ovoj verziji zadatka. Moze se koristiti za proveru kvaliteta resenja\r
+       public List<Polje> getPolja() {\r
+               return nepromenljivaListaPolja;\r
+       }\r
+\r
+       // Vraca vrednost puta\r
+       // Vrednost se definise kao zbir svih vrednosti polja na putu\r
+       public int getVrednost() {\r
+               int rez = 0;\r
+               for (Polje p : polja) {\r
+                       rez = rez + p.getV();\r
+               }\r
+               return rez;\r
+       }\r
+}\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/blago1.txt b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/blago1.txt
new file mode 100644 (file)
index 0000000..5105c10
--- /dev/null
@@ -0,0 +1,5 @@
+5 4\r
+ 0  0  5  0  0\r
+ 0  4 -1  0  0\r
+ 0  1 -1 -1 -1\r
+ 5  0  0  0 -5\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/blago2.txt b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/blago2.txt
new file mode 100644 (file)
index 0000000..7bfb346
--- /dev/null
@@ -0,0 +1,6 @@
+5 5\r
+ 0  0  0 -1 -5 \r
+ 7 -1  0 -1  0\r
+ 0 -1  3  3  5\r
+ 0 -1  1 -1  0\r
+-1 -1 15  0  0\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/blago3.txt b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/blago3.txt
new file mode 100644 (file)
index 0000000..28a830e
--- /dev/null
@@ -0,0 +1,10 @@
+8 9\r
+ 0  0  0  4  0  2  0  0\r
+-1 -1 -1 -1 -1 -1  0 -1\r
+ 0  4  0  3  0  0  0 -1\r
+ 0  2  5  1  0  6  0 -1\r
+ 0 -1 -1 -1  0  0 12 -1\r
+ 0 10 -5  1 -1  0  0 -1\r
+-1 -1 -1  0  0  6  0  1\r
+ 0 -1 20  0 -1  0 -1  0\r
+-1 -1  0  15 0  0 -1 99\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l-prazan.txt b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l-prazan.txt
new file mode 100644 (file)
index 0000000..cc98c8e
--- /dev/null
@@ -0,0 +1,4 @@
+3 3\r
+ 0  0  0\r
+ 0  0  0\r
+ 0  0 -5\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l1.txt b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l1.txt
new file mode 100644 (file)
index 0000000..3b92da0
--- /dev/null
@@ -0,0 +1,5 @@
+5 4\r
+ 0  0  0  0  0\r
+ 0  0 -1  0  0\r
+ 0  0 -1 -1 -1\r
+ 0  0  0  0 -5\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l2.txt b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l2.txt
new file mode 100644 (file)
index 0000000..28796c0
--- /dev/null
@@ -0,0 +1,6 @@
+5 5\r
+ 0  0  0 -1 -5 \r
+ 0 -1  0 -1  0\r
+ 0 -1  0  0  0\r
+ 0 -1  0 -1  0\r
+-1 -1  0  0  0\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l3.txt b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l3.txt
new file mode 100644 (file)
index 0000000..fb1f4e4
--- /dev/null
@@ -0,0 +1,10 @@
+8 9\r
+ 0  0  0  0  0  0  0  0\r
+-1 -1 -1 -1 -1 -1  0 -1\r
+ 0  0  0  0  0  0  0 -1\r
+ 0  0  0  0  0  0  0 -1\r
+ 0 -1 -1 -1  0  0  0 -1\r
+ 0  0 -5  0 -1  0  0 -1\r
+-1 -1 -1  0  0  0  0  0\r
+ 0 -1  0  0 -1  0 -1  0\r
+-1 -1  0  0  0  0 -1  0\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l4.txt b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/l4.txt
new file mode 100644 (file)
index 0000000..444dab5
--- /dev/null
@@ -0,0 +1,11 @@
+10 10\r
+ 0  0  0  0  0  0  0  0  0  0\r
+ 0 -1 -1 -1 -1 -1 -1 -1  0 -1\r
+ 0 -1  0  0  0  0  0 -1  0 -1\r
+ 0 -1  0 -1  0 -1  0 -1  0 -1\r
+ 0 -1  0 -1  0 -1  0 -1  0 -1\r
+ 0 -1  0  0 -5 -1  0 -1  0 -1\r
+ 0  0  0 -1 -1  0  0 -1  0  0\r
+ 0  0  0 -1  0  0 -1  0  0  0\r
+-1 -1  0 -1  0  0  0  0 -1  0\r
+ 0  0  0  0  0  0  0  0 -1  0\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/lav.txt b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/lav.txt
new file mode 100644 (file)
index 0000000..e32db19
--- /dev/null
@@ -0,0 +1,7 @@
+5 6\r
+ 0  0  0 -1 -5\r
+ 0 -1  0 -1  0\r
+ 0 -1  0  0  0\r
+ 0 -1  0 -1  0\r
+-1 -1  0  0  0\r
+ 0 -1  0  0 -1\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/lavblok.txt b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/lavblok.txt
new file mode 100644 (file)
index 0000000..ee5fe19
--- /dev/null
@@ -0,0 +1,4 @@
+3 3\r
+ 0  0  0\r
+ 0 -1 -1\r
+ 0 -1 -5\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/readme.txt b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/readme.txt
new file mode 100644 (file)
index 0000000..cb7d47d
--- /dev/null
@@ -0,0 +1,11 @@
+Pri koristicenju programa moguce je koristiti sledece fajlove:\r
+\r
+lav.txt - sadrzi lavirint koji se moze koristiti za proveru da\r
+li postoji put, ispis puta i ispis najkraceg puta.\r
+\r
+lavblok.txt - sadrzi lavirint u kojem ne postoji put\r
+\r
+l1.txt, l2.txt, l3.txt, l4.txt sadrze razlicite resive lavirinte.\r
+\r
+blago1.txt, blago2.txt i blago3.txt - sadrzi lavirinte sa blagom \r
+za testiranje najvrednijeg puta.\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/zadatak-lavirint.txt b/PretrazivanjeSaVracanjem/Lavirint/SuperKomplikovanoResenje/zadatak-lavirint.txt
new file mode 100644 (file)
index 0000000..5581283
--- /dev/null
@@ -0,0 +1,57 @@
+Zadatak - pretrazivanje sa vracanjem - lavirint\r
+============================================================\r
+\r
+Napisati program koji ucitava lavirint iz fajla i nalazi put\r
+ili puteve sa odredjenim osobinama.\r
+\r
+\r
+Format fajla\r
+------------------------------------------------------------\r
+\r
+Lavirint je u fajlu predstavljen na sledeci nacin:\r
+\r
+U prvom redu se nalaze dva broja S i V (1<= S, V <=10), koji\r
+predstavljaju sirinu i visinu lavirinta. U sledecih V redova\r
+se nalaze po S celih brojeva koji predstavljaju lavirint.\r
+Brojevi imaju sledece znacenje:\r
+\r
+ 0 - prazno polje\r
+-1 - zid, na ovo polje se ne moze stupiti\r
+-5 - izlaz iz lavirinta\r
+\r
+Sa jednog polja se moze preci na drugo, ukoliko imaju\r
+zajednicku stranicu, odnosno mozemo preci na polje levo,\r
+desno, gore ili dole.\r
+\r
+Pri ucitavanju pretpostaviti da ukoliko fajl postoji da su\r
+podaci u njemu ispravno zadati.\r
+\r
+\r
+Zadatak\r
+------------------------------------------------------------\r
+\r
+- Napisati program tako da proverava da li postoji put od\r
+pocetnog polja do izlaza iz lavirinta. Pocetno polje je na\r
+koordinatama 1,1, odnosno u gornjem levom uglu.\r
+\r
+- Program prosiriti tako da na ekran ispisuje trazeni put\r
+(ako postoji).\r
+\r
+- Modifikovati program tako da vraca najkraci put do\r
+izlaza.\r
+\r
+- Razmotriti sledecu modifikaciju problema: \r
+\r
+U drevnim lavirintima se nalaze zlatnici razasuti po\r
+poljima. Ovi lavirinti su veoma opasni, pa ih nije\r
+jednostavno pokupiti, vec se to moze raditi samo pomocu\r
+specijalnih robota. Na srecu pronadjene su mape koje\r
+precizno pokazuju kako lavirinti izgledaju, gde su im izlazi\r
+i koliko zlatnika se moze pokupiti na kom polju. Sada treba\r
+naci put kroz lavirint tako da se pokupi sto vise zlatnika,\r
+a da se pri tome ne nagazi na isto polje dva puta.\r
+\r
+Pri ucitavanju lavirinta, bilo koji pozitivan broj\r
+predstavlja broj zlatnika na tom polju. Program treba da\r
+vraca optimalni put do izlaza, odnosno takav da se pokupi\r
+sto vise zlatnika na putu.\r
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner