gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Lavirint - trazenje najboljeg puta
authorSasa Tosic <sashat@dmi.uns.ac.rs>
Sat, 5 Dec 2015 10:58:35 +0000 (11:58 +0100)
committerDoni Pracner <quinnuendo@gmail.com>
Sat, 5 Dec 2015 10:58:35 +0000 (11:58 +0100)
14 files changed:
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/LavirintProgramV2.java [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/LavirintV2.java [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/Mapa.java [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/Polje.java [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/Resenje.java [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/blago1.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/blago2.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/blago3.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/blago4.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/lav1.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/lav2.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/lavb.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/lavp.txt [new file with mode: 0644]
PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/zadatak-najbolji-put.txt [new file with mode: 0644]

diff --git a/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/LavirintProgramV2.java b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/LavirintProgramV2.java
new file mode 100644 (file)
index 0000000..1b1c4ae
--- /dev/null
@@ -0,0 +1,52 @@
+/**\r
+ * Program za nalazenje puta u lavirintu.\r
+ * \r
+ * Opcija tri nalazi sve puteve i medju njima bira najkraci.\r
+ * \r
+ * Opcija cetiriresava lavirint u kome su rasuti zlatnici na poljima i\r
+ * nalazi put na kome se kupi najvise zlatnika.\r
+ */\r
+\r
+public class LavirintProgramV2 {\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
+  LavirintV2 l = new LavirintV2(fajl);\r
+  Resenje r;\r
+\r
+  if (l != null) {\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 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/NajboljiPut/LavirintV2.java b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/LavirintV2.java
new file mode 100644 (file)
index 0000000..57a536a
--- /dev/null
@@ -0,0 +1,86 @@
+/**\r
+ * Klasa Lavirint sadrzi 2 javne i jednu privatnu metodu za trazenje puteva.\r
+ * \r
+ * Klase KomparatorPoDuzini i KomparatorPoVrednosti predstavljaju komparatore\r
+ * koji se korste pri trazenju najkraceg i najvrednijeg puta.\r
+ */\r
+\r
+import java.util.Comparator;\r
+\r
+public class LavirintV2 {\r
+\r
+ // Polje m sadrzi kompletnu mapu\r
+ private Mapa m;\r
+ // Polje optResenje sluzi za pamcenje optimalnog resenja\r
+ private Resenje optResenje;\r
+\r
+ // Ucitava mapu iz datog fajla i stampa je na ekran\r
+ LavirintV2(String imeFajla) {\r
+  m = Mapa.ucitajIzFajla(imeFajla);\r
+  m.stampaj();\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 Resenje najkraciPut(int x, int y) {\r
+  Resenje r = new Resenje();\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 Resenje najvrednijiPut(int x, int y) {\r
+  Resenje r = new Resenje();\r
+  optPut(x, y, r, 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 resenja se proverava komparatorom\r
+ private void optPut(int x, int y, Resenje r, Comparator<Resenje> 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
+   r.dodaj(x, y, 0);\r
+   if (optResenje == null || c.compare(r, optResenje) < 0) {\r
+    optResenje = r.clone();\r
+   }\r
+   r.izbaciKraj();\r
+  } else {\r
+   m.setPos(x, y, true);\r
+   r.dodaj(x, y, m.getMat(x, y));\r
+   optPut(x + 1, y, r, c);\r
+   optPut(x, y + 1, r, c);\r
+   optPut(x, y - 1, r, c);\r
+   optPut(x - 1, y, r, c);\r
+   m.setPos(x, y, false);\r
+   r.izbaciKraj();\r
+  }\r
+ }\r
+}\r
+\r
+// Komparator za resenja po duzini resenja\r
+class KomparatorPoDuzini implements Comparator<Resenje> {\r
+ public int compare(Resenje r1, Resenje r2) {\r
+  return r1.getLength() - r2.getLength();\r
+ }\r
+}\r
+\r
+// Komparator za resenja po vrednosti resenja\r
+class KomparatorPoVredosti implements Comparator<Resenje> {\r
+ public int compare(Resenje r1, Resenje r2) {\r
+  return r2.getVrednost() - r1.getVrednost();\r
+ }\r
+}
\ No newline at end of file
diff --git a/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/Mapa.java b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/Mapa.java
new file mode 100644 (file)
index 0000000..a5e8a15
--- /dev/null
@@ -0,0 +1,78 @@
+public class Mapa {\r
+ public final static int IZLAZ = -99;\r
+ public final static int ZID = -11;\r
+ public final static int ERROR = Integer.MIN_VALUE;\r
+\r
+ private int visina, sirina;\r
+ private int[][] mat;\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 ERROR;\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 static Mapa ucitajIzFajla(String imeFajla) {\r
+  if (!Svetovid.testIn(imeFajla)) {\r
+   return null;\r
+  }\r
+\r
+  int sirina = Svetovid.in(imeFajla).readInt();\r
+  int visina = Svetovid.in(imeFajla).readInt();\r
+  if (sirina >= 0 && visina >= 0) {\r
+   Mapa res = new Mapa(sirina, visina);\r
+   for (int j = 0; j < visina; j++)\r
+    for (int i = 0; i < sirina; i++)\r
+     res.mat[i][j] = Svetovid.in(imeFajla).readInt();\r
+   Svetovid.closeIn(imeFajla);\r
+   return res;\r
+  } else {\r
+   Svetovid.closeIn(imeFajla);\r
+   return null;\r
+  }\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
diff --git a/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/Polje.java b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/Polje.java
new file mode 100644 (file)
index 0000000..c40fc5f
--- /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
+\r
+public class Polje {\r
+ private int x, y, v;\r
+\r
+ 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
+}
\ No newline at end of file
diff --git a/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/Resenje.java b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/Resenje.java
new file mode 100644 (file)
index 0000000..e29f569
--- /dev/null
@@ -0,0 +1,72 @@
+/**\r
+ * Klasa Resenje koristi se za pamcenje pronadjenog puta.\r
+ * \r
+ * Polje Polja se koristi za pamcenje svih polja na putu.\r
+ * \r
+ * Polje nepromenljivaListaPolja je dodata da se omoguci\r
+ * pristup poljima resenja "spolja" (za proveru kvaliteta puta na primer), \r
+ * ali tako da ne moze da se utice na sam sadrzaj te liste.\r
+ */\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.Collections;\r
+\r
+public class Resenje implements Cloneable {\r
+ private ArrayList<Polje> polja;\r
+\r
+ Resenje() {\r
+  polja = new ArrayList<Polje>();\r
+ }\r
+\r
+ // Dodaje pulje u resenje\r
+ public void dodaj(int x, int y, int v) {\r
+  polja.add(new Polje(x, y, v));\r
+ }\r
+\r
+ // Izbacuje polje iz resenja\r
+ public void izbaciKraj() {\r
+  if (getLength() > 0) {\r
+   polja.remove(getLength() - 1);\r
+  } else {\r
+   System.err.println("greska: resenje je vec prazno");\r
+  }\r
+ }\r
+\r
+ // Stampa resenje\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
+\r
+ // Vraca duzinu resenja\r
+ public int getLength() {\r
+  return polja.size();\r
+ }\r
+\r
+ // Vraca i-to polje na putu. Ne koristi se u ovoj verziji zadatka.\r
+ // Moze se koristiti za proveru kvaliteta resenja\r
+ public Polje getPolje(int i) {\r
+  return polja.get(i);\r
+ }\r
+\r
+ // Kreira klon od resenja\r
+ @Override\r
+ public Resenje clone() {\r
+  Resenje rez = new Resenje();\r
+  for (Polje p : polja) {\r
+   rez.dodaj(p.getX(), p.getY(), p.getV());\r
+  }\r
+  return rez;\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/NajboljiPut/blago1.txt b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/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/NajboljiPut/blago2.txt b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/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/NajboljiPut/blago3.txt b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/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/NajboljiPut/blago4.txt b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/blago4.txt
new file mode 100644 (file)
index 0000000..3839c6d
--- /dev/null
@@ -0,0 +1,10 @@
+8 8\r
+   0   2   3   4   6  55   0 -99\r
+   0 -11   0 -11   7   0   0   0\r
+   0 -11   0 -11   0   0 -11   0\r
+   0   0   2   0 -11   0 -11   0\r
+   0 -11 -11   0 -11   0 -11   0\r
+   0 -11   0   0 -11   0 -11   0\r
+   0 -11 -11   0 -11   0 -11   0\r
+   0   0  44   2   4   0   0   0\r
+\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/lav1.txt b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/lav1.txt
new file mode 100644 (file)
index 0000000..70a9571
--- /dev/null
@@ -0,0 +1,7 @@
+5 6\r
+   0   0   0 -11 -99\r
+   0 -11   0 -11   0\r
+   0 -11   0   0   0\r
+   0 -11   0 -11   0\r
+ -11 -11   0   0   0\r
+   0 -11   0   0 -11\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/lav2.txt b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/lav2.txt
new file mode 100644 (file)
index 0000000..148f5b5
--- /dev/null
@@ -0,0 +1,10 @@
+8 8\r
+   0   0   0   0   0 -11   0 -99\r
+   0 -11   0 -11   0   0   0   0\r
+   0 -11   0 -11   0   0 -11   0\r
+   0   0   0   0 -11   0 -11   0\r
+   0 -11 -11   0 -11   0 -11   0\r
+   0 -11   0   0 -11   0 -11   0\r
+   0 -11 -11   0 -11   0 -11   0\r
+   0   0 -11   0   0   0   0   0\r
+\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/lavb.txt b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/lavb.txt
new file mode 100644 (file)
index 0000000..32632c4
--- /dev/null
@@ -0,0 +1,7 @@
+5 6\r
+  0   0   0 -11 -99\r
+  0 -11   0 -11   0\r
+  0 -11   0 -11   0\r
+  0 -11   0 -11   0\r
+-11 -11   0   0 -11\r
+  0 -11   0   0 -11\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/lavp.txt b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/lavp.txt
new file mode 100644 (file)
index 0000000..0cb506b
--- /dev/null
@@ -0,0 +1,5 @@
+4 4\r
+   0   0   0   0\r
+   0   0   0   0\r
+   0   0   0   0\r
+   0   0   0 -99\r
diff --git a/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/zadatak-najbolji-put.txt b/PretrazivanjeSaVracanjem/Lavirint/NajboljiPut/zadatak-najbolji-put.txt
new file mode 100644 (file)
index 0000000..8c1d6a5
--- /dev/null
@@ -0,0 +1,101 @@
+============================================================\r
+      Zadatak - pretrazivanje sa vracanjem - svi putevi\r
+============================================================\r
+\r
+\r
+Postavka problema\r
+============================================================\r
+\r
+Neka je dat lavirint kao matrica polja, pri cemu razlicite \r
+vrednosti polja imaju razlicito znacenje. Potrebno je pronaci\r
+OPTIMALAN put kroz lavirint od pocetnog polja, do izlaza iz \r
+lavirinta, pri cemu se pod putem smatra niz polja koja je \r
+potrebno posetiti u datom redosledu, da bi se stiglo od \r
+pocetnog polja do cilja. Pri obilasku lavirinta, sa jednog \r
+polja je moguce preci na susedno ako ona imaju istu ivicu, \r
+tj. ako se ono nalazi odmah levo, desno, gore ili dole u \r
+odnosu na trenutno polje.\r
+\r
+Znacenja vrednosti polja su;\r
+0   = slobodno polje u lavirintu na koje je dozvoljeno stati\r
+-11 = zid, polje na koje nije dozvoljeno stati\r
+-99 = izlaz iz lavirinta\r
+bilo koji pozitivan broj = vrednost blaga na tom polju\r
+\r
+Format fajla\r
+------------------------------------------------------------\r
+\r
+Mapa je u fajlu predstavljena na sledeci nacin:\r
+\r
+U prvom redu se nalaze dva broja S i V koji predstavljaju\r
+sirinu i visinu mape.\r
+\r
+U sledecih V redova se nalaze po S celih brojeva koji\r
+predstavljaju vrednosti polja u lavirintu.\r
+\r
+Polje (0, 0) nalazi se u gornjem levom polju matrice.\r
+\r
+\r
+Primeri\r
+------------------------------------------------------------\r
+\r
+Za testiranje programa su dati su fajlovi:\r
+"lav1.txt" i "lav2.txt" u kojima postoji resenje\r
+"lavp.txt" koji ne sadrzi zidove\r
+"lavb.txt" u kojem nije moguce naci resenje\r
+"blago*.txt" za testiranje zadatka sa blagom\r
+\r
+\r
+Zadatak\r
+============================================================\r
+\r
+Napisati klasu LavirintProgram koja ucitava ime fajla u kojem\r
+se nalazi definisan lavirint, koordinate pocetne pozicije \r
+(x, y) od koje se trazi izlaz iz lavirinta, kao i izbor sta \r
+zelimo da radimo. Nakon ucitanog izbora, klasa treba da ucita\r
+lavirint iz datog fajla, ispise ga na ekran i izvrsi izabranu\r
+operaciju. \r
+\r
+Ponuditi korisniku sledeci izbor:\r
+3 - ispis najkraceg puta od unetog polja do izlaza\r
+4 - ispis najvrednijeg puta od unetog polja do izlaza\r
+\r
+\r
+Modifikacija pretrazivanja sa vracanjem\r
+------------------------------------------------------------\r
+\r
+Jedan od nacina da se uradi zadatak je koriscenjem modifikacije\r
+pretrazivanja sa vracanjem. Potrebne modifikacije su sledece:\r
+\r
+1. Nakon dolaska na odredjeno polje u lavirintu potrebno je\r
+to polje ubaciti na kraj trenutnog puta od pocetka lavirinta \r
+do trenutnog polja\r
+2. Nakon povratka sa polja, potrebno je to polje izabaciti sa \r
+kraja trenutnog puta\r
+3. Prilikom obilaska izlaza, potrebno je trenutnu vrednost \r
+puta uporediti sa do sada najoptimalnijim pronadjenim putem\r
+i ukoliko je trenutni put bolji, kopirati ga u optimalan put\r
+4. Vratiti optimalan put ako postoji ili vrednost null ako ne \r
+postoji\r
+\r
+\r
+Neobavezne preporuke:\r
+------------------------------------------------------------\r
+\r
+1. Kreirati posebnu klasu Resenje koja ce pamtiti resenje.\r
+Resenje pamtiti kao niz ili listu polja, od cega za svako\r
+polje treba zapamtiti koordinate polja i vrednost\r
+2. Prilikom uporedjivanja resenja, koristiti komparatore\r
+3. Za racunanje vrednosti puta koristiti metode koje su deo \r
+klase put (npr. getSize() i getValue())\r
+\r
+\r
+Prosirenje zadatka:\r
+------------------------------------------------------------ \r
+\r
+Modifikovati postojece metode za trazenje puta tako da:\r
+\r
+- pronalaze put sa najvrednijim blagom pojedinacno\r
+- pronalaze put na kojem postoji najvise polja sa blagom\r
+- pronalaze put na kojem postoji najvise uzastopnih polja sa\r
+  blagom\r
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner