Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.IOException;
- import java.util.Collections;
- import java.util.Collection;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.LinkedList;
- import java.util.Random;
- import java.util.TreeSet;
- //Pomosna sostojba koja ovozmozuva navrakjanje po cekori nanazad vo rekurziven algoritam
- class pomosnaSostojba {
- pomosnaSostojba parent;
- Sostojba node;
- pomosnaSostojba(pomosnaSostojba pomosenNode, Sostojba nod) {
- this.parent = pomosenNode;
- this.node = nod;
- }
- public String toString() {
- return node.toString() + "";
- }
- }
- //Momentalna sostojba kaj hanojski kuli so 3 kuli
- class Sostojba implements Comparable {
- HanojskaKula h1;
- HanojskaKula h2;
- HanojskaKula h3;
- Sostojba(HanojskaKula h1, HanojskaKula h2, HanojskaKula h3) {
- this.h1 = h1;
- this.h2 = h2;
- this.h3 = h3;
- }
- public int compareTo(Sostojba o) {
- o = (Sostojba) o;
- String cmp = h1.plocki.toString() + " " + h2.plocki.toString() + " "
- + h3.plocki.toString();
- String cmp2 = o.h1.plocki.toString() + " " + o.h2.plocki.toString()
- + " " + o.h3.plocki.toString();
- return cmp.compareTo(cmp2);
- }
- public boolean equals(Object obj) {
- if (this.compareTo((Sostojba) obj) == 0)
- return true;
- return false;
- }
- @Override
- public int compareTo(Object o) {
- return this.compareTo((Sostojba) o);
- }
- public String toString() {
- return "Sostojba: \n" + h1.plocki.toString() + "\n"
- + h2.plocki.toString() + "\n" + h3.plocki.toString() + "\n";
- }
- }
- //Implementacija na kula so ID, i lista od plocki (int)
- class HanojskaKula implements Cloneable {
- LinkedList<Integer> plocki;
- String id;
- HanojskaKula(String id) {
- plocki = new LinkedList<Integer>();
- this.id = id;
- }
- public void add(int plocka) {
- plocki.add(plocka);
- }
- public void remove() {
- plocki.remove();
- }
- }
- //Lavirit pretstaven vo patrica
- class Lavirint {
- char[][] matrix;
- int w;
- int h;
- //Konstruktor so sirina i visina na lavirintot, koj povikuva funkcija za generiranje na istiot
- Lavirint(int w, int h) {
- this.w = w;
- this.h = h;
- matrix = new char[w][h];
- randomize();
- }
- //Funkcija koja so verojatnost 0.6 postavuva prolaz na edno pole, a so verojatnost 0.4 postavuva blokada
- public void randomize() {
- Random rand = new Random();
- for (int i = 0; i < w; i++) {
- for (int j = 0; j < h; j++) {
- int n = rand.nextInt(10);
- if (i == 0 && j == 0) {
- matrix[i][j] = '.';
- } else if (i == w - 1 && j == h - 1) {
- matrix[i][j] = '.';
- } else if (n >= 0 && n <= 6) {
- // prolaz
- matrix[i][j] = '.';
- } else {
- // blok
- matrix[i][j] = '|';
- }
- }
- }
- }
- public void printMatrix() {
- for (int i = 0; i < w; i++) {
- for (int j = 0; j < h; j++) {
- System.out.print(matrix[i][j] + " ");
- }
- System.out.println();
- }
- System.out.println("\n\n\n");
- }
- //Generiranje na orientiran graf od dobieniot lavirint
- public Graph makeGraph() {
- LinkedList<Node> nodes = new LinkedList<Node>();
- int brojac = 2;
- for (int i = 0; i < w; i++) {
- for (int j = 0; j < h; j++) {
- if (i == 0 && j == 0) {
- nodes.add(new Node(1));
- } else if (i == w - 1 && j == h - 1) {
- nodes.add(new Node(w * h));
- } else {
- nodes.add(new Node(brojac++));
- }
- }
- }
- Graph graf = new Graph(nodes);
- graf.setRoot(nodes.getFirst());
- for (int i = 0; i < w; i++) {
- for (int j = 0; j < h; j++) {
- if (matrix[i][j] == '.') {
- int index = i * w + j;
- // proveri desno
- if (j < h - 1 && matrix[i][j + 1] == '.') {
- // System.out.println(index + " ima sosed desno");
- graf.connectNodes(nodes.get(index),
- nodes.get(index + 1));
- }
- // proveri dole
- if (i < w - 1 && matrix[i + 1][j] == '.') {
- // System.out.println(index + " ima sosed dole");
- graf.connectNodes(nodes.get(index),
- nodes.get(index + w));
- }
- // proveri gore
- if (i > 0 && matrix[i - 1][j] == '.') {
- // System.out.println(index + " ima sosed gore");
- graf.connectNodes(nodes.get(index),
- nodes.get(index - w));
- }
- // proveri levo
- if (j > 0 && matrix[i][j - 1] == '.') {
- // System.out.println(index + " ima sosed levo");
- graf.connectNodes(nodes.get(index),
- nodes.get(index - 1));
- }
- }
- }
- }
- return graf;
- }
- }
- class Node {
- LinkedList<Node> neighbours;
- int value;
- // Konstruktor
- Node(int value) {
- neighbours = new LinkedList<Node>();
- this.value = value;
- }
- // Konstrukor so sosedi (po potreba)
- Node(LinkedList<Node> neighbours, int value) {
- neighbours = new LinkedList<Node>();
- Iterator<Node> a = neighbours.iterator();
- while (a.hasNext()) {
- this.neighbours.add(a.next());
- }
- this.value = value;
- }
- // Vrati ja listata na sosedi na ova teme
- public LinkedList<Node> getNeighbours() {
- return this.neighbours;
- }
- // Dodadi sosed
- public void addNeighbour(Node ne) {
- this.neighbours.add(ne);
- }
- // Izbrisi sosed (po potreba)
- public void removeNeighbour(Node ne) {
- if (this.neighbours.contains(ne))
- this.neighbours.remove(ne);
- }
- // Tostring override
- public String toString() {
- return "" + value;
- }
- }
- class Graph {
- Node root;
- LinkedList<Node> nodes;
- // Konstruktor
- Graph(LinkedList<Node> nodes) {
- this.nodes = new LinkedList<Node>();
- Iterator<Node> a = nodes.iterator();
- while (a.hasNext()) {
- this.nodes.add(a.next());
- }
- }
- // Postavi go korenot vo grafot
- public void setRoot(Node root) {
- this.root = root;
- }
- // Vrati indeks na node so odredena vrednost
- // Nodovi nemozat da imaat ista int vrenost
- public int findNode(int value) {
- int i = 0;
- Iterator<Node> a = nodes.iterator();
- while (a.hasNext()) {
- Node tmp = a.next();
- if (tmp.value == value)
- return i;
- i++;
- }
- return -1;
- }
- // Povrzi 2 nodovi
- public void connectNodes(Node n1, Node n2) {
- int index1 = findNode(n1.value);
- int index2 = findNode(n2.value);
- nodes.get(index1).addNeighbour(n2);
- }
- }
- //Pomosen jazol so parent pointer koj ni dozvoluva da se navrakjame nanazad vo rekurzivni algoritmi
- class pomosenNode {
- pomosenNode parent;
- Node node;
- pomosenNode(pomosenNode pomosenNode, Node nod) {
- this.parent = pomosenNode;
- this.node = nod;
- }
- public String toString() {
- return node.value + "";
- }
- }
- public class DFS {
- public static void main(String[] args) throws IOException {
- System.out
- .println("Zdravo, jas sum Gorjan Jovanovski, i ova e mojata domasna.");
- System.out
- .println("Sledat demonstracii na DFS iterativno, rekurzivno, DFS Deepening, BFS, resenie na primer 1, resenie na lavirint i hanojskite kuli.");
- System.out.print("Pritisnete koe bilo kopce za DFS Iterativno.");
- System.in.read();
- System.in.read();
- // Kreiraj lista na teminja
- LinkedList<Node> teminja = new LinkedList<Node>();
- // Kreiraj teminja so soodvetni int vrednost
- Node n1 = new Node(1);
- Node n2 = new Node(2);
- Node n3 = new Node(3);
- Node n4 = new Node(4);
- // Dodaj gi vo listata
- teminja.add(n1);
- teminja.add(n2);
- teminja.add(n3);
- teminja.add(n4);
- // Kreiraj graf so listata
- Graph graf = new Graph(teminja);
- // Postavi koj e korenot na grafot (od kaj da pocne prebaruvanjeto)
- graf.setRoot(n1); // Nivo 1
- // Povrzi gi nodovite 1 i 2
- graf.connectNodes(n1, n2); // Nivo 2
- // Povrzi gi nodovite 1 i 3
- graf.connectNodes(n1, n3); // Nivo 2
- // Povrzi gi nodovite 3 i 4
- graf.connectNodes(n3, n4); // Nivo 3
- // Prebaraj vo grafot za dadena int vrednost so DFS
- // graf, barana vrednost, maks dlabovina
- System.out.println("DFS Iterativno");
- DFS_Iterativen_Dlabocina(graf, 4, 3);
- System.out.print("\n\nPritisnete koe bilo kopce za DFS Rekurzivno.");
- System.in.read();
- System.in.read();
- // Prebaraj so DFS rekurzivno so maks dlabocina
- // poceten jazol, barana vrednost, segasna dlabocina, maks dlabocina
- System.out.println("\nDFS Rekurzivno");
- DFS_Rekurziven_Dlabocina(graf.root, 4, 1, 3);
- System.out.print("\n\nPritisnete koe bilo kopce za BFS Iterativno.");
- System.in.read();
- System.in.read();
- // Prebaraj vo grafot za dadena int vrednost so BFS
- // graf, barana vrednost, maks dlabovina
- System.out.println("\nBFS Iterativno");
- BFS_Iterativen_Dlabocina(graf, 4);
- System.out
- .print("\n\nPritisnete koe bilo kopce za DFS Iterative Deepening.");
- System.in.read();
- System.in.read();
- // Prebaraj so iterative deepeing DFS
- System.out.println("\nDFS Iterative Deep");
- DFS_Iterative_Deep(graf, 4, 3);
- System.out
- .print("\n\nPritisnete koe bilo kopce za resavanje na primer 1.");
- System.in.read();
- System.in.read();
- // Resi primer 1 so BFS
- primer1();
- System.out
- .print("\n\nPritisnete koe bilo kopce za resavanje na lavirint.");
- System.in.read();
- System.in.read();
- // Lavirint - bara od poleto gore levo do poleto dole desno
- System.out.println("\n\n-----------LAVIRINT---------\n\n");
- // Lavirint redici
- int lavw = 5;
- // Lavirint koloni
- int lavh = 5;
- // Init
- Lavirint lavirint = new Lavirint(lavw, lavh);
- // Kako izgleda generiraniot lavirit
- lavirint.printMatrix();
- // Kreiraj graf
- Graph lavgraf = lavirint.makeGraph();
- // DFS (do dlabocina 100, po potreba se zgolemuva)
- // Printa lista od koe na koe teme treba da ide, ako najde rez
- System.out.println("\n\n Sega so DFS ke go resime: \n");
- LinkedList<Node> rez = DFS_Iterativen_Dlabocina(lavgraf, lavw * lavh,
- 100);
- if (rez != null)
- System.out.println(rez.toString());
- // BFS
- System.out.println("\n\n Sega so BFS ke go resime: \n");
- BFS_Iterativen_Dlabocina_Multivalue(lavgraf, lavw * lavh, 0);
- System.out
- .print("\n\nPritisnete koe bilo kopce za resavanje na hajoski.");
- System.in.read();
- System.in.read();
- // Hanoj
- hanoj(3);
- System.out.println("\nToa e toa, pozdrav :)");
- }
- //Izminati sostojbi kaj hanojskite kuli
- static LinkedList<Sostojba> izminatiSostojbi;
- //Lista na pomosni sostojbi od kaj sto ke se vratime na tocnata pateka
- static LinkedList<pomosnaSostojba> pateka;
- public static void hanoj(int n) {
- //Inicijalizacija na patekata
- pateka = new LinkedList<pomosnaSostojba>();
- //Inicijalizacija na izminatite sostojbi
- izminatiSostojbi = new LinkedList<Sostojba>();
- //Kreiranje na prvata hanojska sostojba so struktura
- //[3,2,1]
- //[]
- //[]
- HanojskaKula h1 = new HanojskaKula("1");
- h1.add(3);
- h1.add(2);
- h1.add(1);
- HanojskaKula h2 = new HanojskaKula("2");
- HanojskaKula h3 = new HanojskaKula("3");
- //Kreiranje sostojba od 3te hanojski kuli
- Sostojba pocetok = new Sostojba(h1, h2, h3);
- //Dodavanje na sostojbata vo patekata
- pateka.push(new pomosnaSostojba(null, pocetok));
- //Kreiranje na krajnata hanojska sostojba so struktura
- //[]
- //[3,2,1]
- //[]
- HanojskaKula h11 = new HanojskaKula("1");
- HanojskaKula h12 = new HanojskaKula("2");
- h12.add(3);
- h12.add(2);
- h12.add(1);
- HanojskaKula h13 = new HanojskaKula("3");
- //Krekiranje krajna sostojba
- Sostojba kraj = new Sostojba(h11, h12, h13);
- System.out.println("\n\nPocetna sostojba: ");
- System.out.println(pocetok);
- System.out.println("Krajna sostojba: ");
- System.out.println(kraj);
- //Dodavaje na pocetokot kako izminata sostojba
- izminatiSostojbi.add(pocetok);
- //Povikuvanje na DFS so parametri pocetok i kraj (t.e. segasna sostojba i krajna)
- hanojDFS(pocetok, kraj);
- }
- //Ja optimizira patekata sto ja nasol DFS-to otstranuvajki nepotrebni cekori
- public static void ekstraCekori(LinkedList<pomosnaSostojba> lista) {
- /* Za sekoj 3 posledovatelni cekori, proveri dali prvite brojki im se isti negde, i ako se kikni go sredniot cekor
- * primer:
- * Sostojba 1:
- * [3,2,1]
- * []
- * []
- *
- * Sostojba 2:
- * [3,2]
- * [1]
- * []
- * Sostojba 3:
- * [3,2]
- * []
- * [1]
- *
- * Sredniot cekor e nepotreben, i pritoa ke go isfrlime za optimizacija na rezultatot, sepak DFS vrakja tocen no neoptimalen rezultat
- */
- for (int i = 0; i < lista.size() - 2; i++) {
- boolean skok = false;
- int kaj = 0;
- if (!lista.get(i).node.h1.plocki.isEmpty()
- && !lista.get(i + 1).node.h2.plocki.isEmpty()
- && !lista.get(i + 2).node.h3.plocki.isEmpty())
- if (lista.get(i).node.h1.plocki.getLast() == lista.get(i + 1).node.h2.plocki
- .getLast()
- && lista.get(i + 1).node.h2.plocki.getLast() == lista
- .get(i + 2).node.h3.plocki.getLast()) {
- skok = true;
- kaj=1;
- }
- if (!lista.get(i).node.h1.plocki.isEmpty()
- && !lista.get(i + 2).node.h2.plocki.isEmpty()
- && !lista.get(i + 1).node.h3.plocki.isEmpty())
- if (lista.get(i).node.h1.plocki.getLast() == lista.get(i + 2).node.h2.plocki
- .getLast()
- && lista.get(i + 2).node.h2.plocki.getLast() == lista
- .get(i + 1).node.h3.plocki.getLast()) {
- skok = true;
- kaj=2;
- }
- if (!lista.get(i + 1).node.h1.plocki.isEmpty()
- && !lista.get(i).node.h2.plocki.isEmpty()
- && !lista.get(i + 2).node.h3.plocki.isEmpty())
- if (lista.get(i + 1).node.h1.plocki.getLast() == lista.get(i).node.h2.plocki
- .getLast()
- && lista.get(i).node.h2.plocki.getLast() == lista
- .get(i + 2).node.h3.plocki.getLast()) {
- skok = true;
- kaj=3;
- }
- if (!lista.get(i + 1).node.h1.plocki.isEmpty()
- && !lista.get(i + 2).node.h2.plocki.isEmpty()
- && !lista.get(i).node.h3.plocki.isEmpty())
- if (lista.get(i + 1).node.h1.plocki.getLast() == lista
- .get(i + 2).node.h2.plocki.getLast()
- && lista.get(i + 2).node.h2.plocki.getLast() == lista
- .get(i).node.h3.plocki.getLast()) {
- skok = true;
- kaj=4;
- }
- if (!lista.get(i + 2).node.h1.plocki.isEmpty()
- && !lista.get(i).node.h2.plocki.isEmpty()
- && !lista.get(i + 1).node.h3.plocki.isEmpty())
- if (lista.get(i + 2).node.h1.plocki.getLast() == lista.get(i).node.h2.plocki
- .getLast()
- && lista.get(i).node.h2.plocki.getLast() == lista
- .get(i + 1).node.h3.plocki.getLast()) {
- skok = true;
- kaj=5;
- }
- if (!lista.get(i + 2).node.h1.plocki.isEmpty()
- && !lista.get(i + 1).node.h2.plocki.isEmpty()
- && !lista.get(i).node.h3.plocki.isEmpty())
- if (lista.get(i + 2).node.h1.plocki.getLast() == lista
- .get(i + 1).node.h2.plocki.getLast()
- && lista.get(i + 1).node.h2.plocki.getLast() == lista
- .get(i).node.h3.plocki.getLast()) {
- skok = true;
- kaj=6;
- }
- // Debug za brisenje
- if(skok){
- //System.out.println("BRISAM --- " + kaj);
- //System.out.println(lista.get(i).node);
- //System.out.println(lista.get(i + 1).node);
- //System.out.println(lista.get(i + 2).node);
- lista.remove(i + 1);
- i = 0;
- }
- }
- //Finalno printanje na rezultatot otkako e optimiziran
- System.out.println("Ova e finalniot optimiziran pat:");
- for (int i = 0; i < lista.size(); i++) {
- System.out.println(lista.get(i).node);
- }
- }
- public static void hanojDFS(Sostojba sega, Sostojba kraj) {
- //Zemanje 2 razlicni kuli za da se pravi sporedba
- for (int i = 0; i < 3; i++) {
- HanojskaKula tmp;
- if (i == 0) {
- tmp = sega.h1;
- } else if (i == 1) {
- tmp = sega.h2;
- } else {
- tmp = sega.h3;
- }
- //Ako sme odbrale prazna kula, skokni ja
- if (tmp.plocki.isEmpty())
- continue;
- for (int j = 0; j < 3; j++) {
- //Ako sme ja odbrale vtorata da e identicna so prvata, skokni jas
- if (j == i)
- continue;
- HanojskaKula tmp2;
- if (j == 0) {
- tmp2 = sega.h1;
- } else if (j == 1) {
- tmp2 = sega.h2;
- } else {
- tmp2 = sega.h3;
- }
- //Ako vtorata e prazna, ili poslednata plocka na vtorata e pogolema od prvata, stavi ja taa od prvata na vtorata
- if (tmp2.plocki.isEmpty()
- || tmp2.plocki.getLast() > tmp.plocki.getLast()) {
- HanojskaKula h1;
- HanojskaKula h2;
- HanojskaKula h3;
- h3 = new HanojskaKula("3");
- h3.plocki = (LinkedList<Integer>) sega.h3.plocki.clone();
- h2 = new HanojskaKula("2");
- h2.plocki = (LinkedList<Integer>) sega.h2.plocki.clone();
- h1 = new HanojskaKula("1");
- h1.plocki = (LinkedList<Integer>) sega.h1.plocki.clone();
- if (i == 0) {
- if (j == 1) {
- h2.add(h1.plocki.removeLast());
- } else {
- h3.add(h1.plocki.removeLast());
- }
- } else if (i == 1) {
- if (j == 0) {
- h1.add(h2.plocki.removeLast());
- } else {
- h3.add(h2.plocki.removeLast());
- }
- } else {
- if (j == 0) {
- h1.add(h3.plocki.removeLast());
- } else {
- h2.add(h3.plocki.removeLast());
- }
- }
- //Napravi nova sostojba po promenata
- Sostojba tmpsostojba = new Sostojba(h1, h2, h3);
- //Proveri dali e izminata do sega sostojbata
- //ps. ovde treba da se override-ne equals kaj pomosnaSostojba, bidejki .contains raboti
- // so equals mesto so compareTo
- if (!izminatiSostojbi.contains(tmpsostojba)) {
- //Cim ne e, dodadi ja kako izminata
- izminatiSostojbi.add(tmpsostojba);
- //Proveri dali e krajnata sostojba
- if (tmpsostojba.compareTo(kraj) == 0) {
- System.out.println("NAJDOV!");
- System.out.println(tmpsostojba);
- //Dodadi ja nea vo patekata so pomosni sostojbi
- for (int z = 0; z < pateka.size(); z++) {
- if (pateka.get(z).node.compareTo(sega) == 0) {
- pomosnaSostojba tmps = pateka.get(z);
- //Finalna lista na cekori koja ke se optimizira
- LinkedList<pomosnaSostojba> finalno = new LinkedList<pomosnaSostojba>();
- pomosnaSostojba finals = null;
- for (int r = 0; r < pateka.size(); r++) {
- if (pateka.get(r).node.compareTo(sega) == 0) {
- finals = new pomosnaSostojba(
- pateka.get(r), tmpsostojba);
- }
- }
- finalno.add(finals);
- //Pocni da se navrakjas nanazad po parent pointeri na pomosnite sostojbi
- // za da dojdes do celata izminata pateka
- while (tmps != null) {
- finalno.add(tmps);
- tmps = tmps.parent;
- }
- //Prevrti ja za da se dobie pravilno
- Collections.reverse(finalno);
- //Povikaj funcija za optimiziranje i printanje na rezultatot
- ekstraCekori(finalno);
- }
- }
- } else {
- //Najdi go segasniot node vo pomosni sostojbi
- for (int z = 0; z < pateka.size(); z++) {
- if (pateka.get(z).node.compareTo(sega) == 0) {
- //dodaj ja novata sostojba so parent pointer kon segasnata
- pateka.add(new pomosnaSostojba(pateka
- .get(z), tmpsostojba));
- }
- }
- //Rekurzija
- hanojDFS(tmpsostojba, kraj);
- }
- }
- }
- }
- }
- }
- // Da ima po 4 litri vo koja bilo od casite
- public static void primer1() {
- System.out.println("\n--------------\nPrimer 1 \n--------------");
- LinkedList<Node> teminja = new LinkedList<Node>();
- // Kreiraj teminja so soodvetni int vrednost
- Node n30 = new Node(30);
- Node n31 = new Node(31);
- Node n32 = new Node(32);
- Node n33 = new Node(33);
- Node n34 = new Node(34);
- Node n35 = new Node(35);
- Node n20 = new Node(20);
- Node n25 = new Node(25);
- Node n10 = new Node(10);
- Node n15 = new Node(15);
- Node n00 = new Node(0);
- Node n01 = new Node(1);
- Node n02 = new Node(2);
- Node n03 = new Node(3);
- Node n04 = new Node(4);
- Node n05 = new Node(5);
- // Dodaj gi vo listata
- teminja.add(n30);
- teminja.add(n31);
- teminja.add(n32);
- teminja.add(n33);
- teminja.add(n34);
- teminja.add(n35);
- teminja.add(n20);
- teminja.add(n25);
- teminja.add(n10);
- teminja.add(n15);
- teminja.add(n00);
- teminja.add(n01);
- teminja.add(n02);
- teminja.add(n03);
- teminja.add(n04);
- teminja.add(n05);
- // Kreiraj graf so listata
- Graph graf = new Graph(teminja);
- // Postavi koj e korenot na grafot (od kaj da pocne prebaruvanjeto)
- graf.setRoot(n00); // Nivo 1
- // 0/0
- graf.connectNodes(n00, n05);
- graf.connectNodes(n00, n30);
- // 1/0
- graf.connectNodes(n10, n00);
- graf.connectNodes(n10, n30);
- graf.connectNodes(n10, n15);
- // 2/0
- graf.connectNodes(n20, n30);
- graf.connectNodes(n20, n00);
- graf.connectNodes(n20, n25);
- graf.connectNodes(n20, n02);
- // 3/0
- graf.connectNodes(n30, n00);
- graf.connectNodes(n30, n03);
- graf.connectNodes(n30, n35);
- // 0/1
- graf.connectNodes(n01, n10);
- graf.connectNodes(n01, n00);
- graf.connectNodes(n01, n31);
- graf.connectNodes(n01, n05);
- // 3/1
- graf.connectNodes(n31, n01);
- graf.connectNodes(n31, n30);
- graf.connectNodes(n31, n35);
- graf.connectNodes(n31, n04);
- // 0/2
- graf.connectNodes(n02, n20);
- graf.connectNodes(n02, n00);
- graf.connectNodes(n02, n32);
- graf.connectNodes(n02, n05);
- // 3/2
- graf.connectNodes(n32, n05);
- graf.connectNodes(n32, n30);
- graf.connectNodes(n32, n35);
- graf.connectNodes(n32, n02);
- // 0/3
- graf.connectNodes(n03, n05);
- graf.connectNodes(n03, n00);
- graf.connectNodes(n03, n33);
- graf.connectNodes(n03, n30);
- // 3/3
- graf.connectNodes(n33, n03);
- graf.connectNodes(n33, n30);
- graf.connectNodes(n33, n35);
- graf.connectNodes(n33, n15);
- // 0/4
- graf.connectNodes(n04, n05);
- graf.connectNodes(n04, n00);
- graf.connectNodes(n04, n34);
- graf.connectNodes(n04, n31);
- // 3/4
- graf.connectNodes(n34, n35);
- graf.connectNodes(n34, n30);
- graf.connectNodes(n34, n04);
- graf.connectNodes(n34, n25);
- // 0/5
- graf.connectNodes(n05, n35);
- graf.connectNodes(n05, n00);
- graf.connectNodes(n05, n32);
- // 3/5
- graf.connectNodes(n35, n30);
- graf.connectNodes(n35, n05);
- // 2/5
- graf.connectNodes(n25, n20);
- graf.connectNodes(n25, n05);
- graf.connectNodes(n25, n34);
- graf.connectNodes(n25, n35);
- // 1/5
- graf.connectNodes(n15, n33);
- graf.connectNodes(n15, n10);
- graf.connectNodes(n15, n05);
- graf.connectNodes(n15, n35);
- BFS_Iterativen_Dlabocina_Multivalue(graf, 34, 4);
- }
- public static LinkedList<Node> DFS_Iterativen_Dlabocina(Graph graf,
- int value, int depth) {
- // Kreiraj stek
- LinkedList<Node> stek = new LinkedList<Node>();
- // Kreiraj lista na iskoristeni
- LinkedList<Node> iskoristeni = new LinkedList<Node>();
- // Dodaj go temeto vo stekot
- stek.add(graf.root);
- System.out.println("Stavam " + graf.root);
- // Dali e najdeno temeto?
- boolean najdov = false;
- // Se dodeka stekot ima elementi
- while (!stek.isEmpty()) {
- // Dali bilo dodadeno vo stekot?
- boolean promena = false;
- // Ako go najde, prekini so prebaruvanje
- if (stek.peek().value == value) {
- System.out.println("Najdov!");
- najdov = true;
- break;
- }
- // Proveri gi sosedite na najgorniot element vo stekot
- System.out.println("Proveruvam sosedi na " + stek.peek());
- for (int i = 0; i < stek.peek().getNeighbours().size(); i++) {
- // Dali toj sosed e iskoristen
- if (!iskoristeni.contains(stek.peek().getNeighbours().get(i))
- && stek.size() < depth) {
- // Postavi go kako iskoristen i stavi go vo stekto
- System.out.println("Stavam "
- + stek.peek().getNeighbours().get(i));
- iskoristeni.push((stek.peek().getNeighbours().get(i)));
- stek.push(stek.peek().getNeighbours().get(i));
- // Obelezi deka e napravena promena
- promena = true;
- break;
- }
- }
- // Ako nema promena, vadi od stekot
- if (!promena) {
- System.out.println("Vadam " + stek.peek());
- stek.pop();
- }
- }
- // Ako ne e najdeno nisto, pisi soodvetna poraka
- if (!najdov) {
- System.out.println("Nema!");
- return null;
- }
- Collections.reverse(stek);
- return stek;
- }
- public static void DFS_Rekurziven_Dlabocina(Node nod, int value, int depth,
- int maxdepth) {
- System.out.println("Rabotam so " + nod.value);
- if (nod.value == value) {
- System.out.println("Najdov!");
- } else if (depth < maxdepth) {
- for (int i = 0; i < nod.neighbours.size(); i++) {
- DFS_Rekurziven_Dlabocina(nod.neighbours.get(i), value,
- depth + 1, maxdepth);
- }
- }
- }
- public static void BFS_Iterativen_Dlabocina(Graph graf, int value) {
- // Kreiraj stek
- LinkedList<Node> stek = new LinkedList<Node>();
- // Kreiraj lista na iskoristeni
- LinkedList<Node> iskoristeni = new LinkedList<Node>();
- // Dodaj go temeto vo stekot
- stek.add(graf.root);
- System.out.println("Stavam " + graf.root);
- // Dali e najdeno temeto?
- boolean najdov = false;
- // Se dodeka stekot ima elementi
- while (!stek.isEmpty()) {
- // Dali bilo dodadeno vo stekot?
- boolean promena = false;
- boolean najdeno = false;
- // Proveri gi sosedite na najgorniot element vo stekot
- System.out.println("Proveruvam sosedi na " + stek.getLast());
- for (int i = 0; i < stek.getLast().getNeighbours().size(); i++) {
- // Dali toj sosed e iskoristen
- if (!iskoristeni
- .contains(stek.getLast().getNeighbours().get(i))) {
- // Postavi go kako iskoristen i stavi go vo stekto
- System.out.println("Stavam "
- + stek.getLast().getNeighbours().get(i));
- iskoristeni.push((stek.getLast().getNeighbours().get(i)));
- stek.push(stek.getLast().getNeighbours().get(i));
- // Obelezi deka e napravena promena
- promena = true;
- // Ako go najde, prekini so prebaruvanje
- if (stek.peek().value == value) {
- System.out.println("Najdov!");
- najdeno = true;
- najdov = true;
- break;
- }
- }
- }
- // Ako e najdeno
- if (najdeno) {
- break;
- }
- // Ako nema promena, vadi od stekot
- if (!promena) {
- System.out.println("Vadam " + stek.getLast());
- stek.removeLast();
- }
- }
- // Ako ne e najdeno nisto, pisi soodvetna poraka
- if (!najdov)
- System.out.println("Nema!");
- }
- public static void BFS_Iterativen_Dlabocina_Multivalue(Graph graf,
- int value, int value2) {
- // Kreiraj stek
- LinkedList<Node> stek = new LinkedList<Node>();
- // Kreiraj lista na iskoristeni
- LinkedList<Node> iskoristeni = new LinkedList<Node>();
- // Pateka
- LinkedList<pomosenNode> pateka = new LinkedList<pomosenNode>();
- pateka.push(new pomosenNode(null, graf.root));
- // Dodaj go temeto vo stekot
- stek.add(graf.root);
- System.out.println("Stavam " + graf.root);
- // Dali e najdeno temeto?
- boolean najdov = false;
- // Se dodeka stekot ima elementi
- while (!stek.isEmpty()) {
- // Dali bilo dodadeno vo stekot?
- boolean promena = false;
- boolean najdeno = false;
- // Proveri gi sosedite na najgorniot element vo stekot
- System.out.println("Proveruvam sosedi na " + stek.getLast());
- for (int i = 0; i < stek.getLast().getNeighbours().size(); i++) {
- // Dali toj sosed e iskoristen
- if (!iskoristeni
- .contains(stek.getLast().getNeighbours().get(i))) {
- // Postavi go kako iskoristen i stavi go vo stekto
- System.out.println("Stavam "
- + stek.getLast().getNeighbours().get(i));
- iskoristeni.push((stek.getLast().getNeighbours().get(i)));
- for (int z = 0; z < pateka.size(); z++) {
- if (pateka.get(z).node.value == stek.getLast().value) {
- System.out.println(pateka.get(z));
- pateka.push(new pomosenNode(pateka.get(z), stek
- .getLast().getNeighbours().get(i)));
- break;
- }
- }
- stek.push(stek.getLast().getNeighbours().get(i));
- // Obelezi deka e napravena promena
- promena = true;
- // Ako go najde, prekini so prebaruvanje
- if (stek.peek().value == value
- || stek.peek().value == value2) {
- LinkedList<pomosenNode> rev = new LinkedList<pomosenNode>();
- pomosenNode tmp = null;
- System.out.println("Najdov!");
- for (int z = 0; z < pateka.size(); z++) {
- if (pateka.get(z).node.value == value
- || pateka.get(z).node.value == value2) {
- tmp = pateka.get(z);
- while (tmp.parent != null) {
- rev.add(tmp);
- tmp = tmp.parent;
- }
- }
- }
- rev.add(tmp);
- Collections.reverse(rev);
- System.out.println(rev.toString());
- najdeno = true;
- najdov = true;
- break;
- }
- }
- }
- // Ako e najdeno
- if (najdeno) {
- break;
- }
- // Ako nema promena, vadi od stekot
- if (!promena) {
- System.out.println("Vadam " + stek.getLast());
- stek.removeLast();
- }
- }
- // Ako ne e najdeno nisto, pisi soodvetna poraka
- if (!najdov)
- System.out.println("Nema!");
- }
- public static void DFS_Iterative_Deep(Graph graf, int value, int depth) {
- for (int i = 1; i <= depth; i++) {
- System.out.println("Proveruvam na dlabocina: " + i);
- if (DFS_Iterativen_Dlabocina(graf, value, i) != null)
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement