aboutsummaryrefslogtreecommitdiff
path: root/Info/11/NTG/1/Breitensuche/Implementierung/Repository Breitensuche.json
blob: 2e5d20052f2392039bc230ec5a1ec123692d082a (plain)
1
2
3
4
5
6
{
   "name": "Breitensuche",
   "files": "[{\"id\":2497876,\"version\":2,\"filename\":\"Graph\",\"path\":[],\"text\":\"class Graph {\\n   // Attribut, das die aktuelle Anzahl an Knoten speichert\\n   int anzKnoten;\\n   // Knotenarray\\n   Knoten[] knoten;\\n   // Adjazenzmatrix\\n   int[][] kanten;\\n   \\n   /**\\n    * Erzeugt einen neuen Graphen.\\n    * \\n    * Der neue Graph hat Platz fuer maxAnzahlKnoten.\\n    * Er enthaelt nach der Initialisierung weder Knoten noch\\n    * Kanten.\\n    * @param maxAnzahlKnoten die maximale Anzahl an Knoten\\n    */\\n   Graph(int maxAnzahlKnoten) {\\n      // Initialisierung der Attribute\\n      anzKnoten \\u003d 0; // Der Graph enthaelt noch keine Knoten\\n      knoten \\u003d new Knoten[maxAnzahlKnoten];\\n      kanten \\u003d new int[maxAnzahlKnoten][maxAnzahlKnoten];\\n\\n      // Initialisierung der leeren Adjazenzmatrix\\n      for (int i \\u003d 0; i \\u003c maxAnzahlKnoten; i++) {\\n         for (int j \\u003d 0; j \\u003c maxAnzahlKnoten; j++) {\\n            kanten[i][j] \\u003d -1;\\n         }\\n      }\\n \\n   }\\n\\n   /**\\n    * Liefert die Bezeichnung eines Knoten\\n    * \\n    * @param knotenIndex der Index des Knoten\\n    * @return die Bezeichnung des Knoten\\n    */\\n   String knotenBezeichnungFinden(int knotenIndex) {\\n      Knoten knotenAnIndex \\u003d knoten[knotenIndex];\\n      return knotenAnIndex.bezeichnung;\\n   }\\n\\n   /**\\n    * Findet den Index eines Knoten anhand seiner Bezeichnung\\n    * \\n    * @param bezeichnung die Bezeichnung des Knoten\\n    * @return den Index des Knoten, -1 falls Knoten nicht gefunden\\n    */\\n   int knotenFinden(String bezeichnung) {\\n      for (int i \\u003d 0; i \\u003c anzKnoten; i++) {\\n         if(knoten[i].bezeichnung \\u003d\\u003d bezeichnung) {\\n            return i;\\n         }\\n      }\\n      return -1;\\n   }\\n\\n   /**\\n    * Fuegt einen neuen Knoten dem Graph hinzu\\n    * \\n    * @param bezeichnung die Bezeichnung des neuen Knoten\\n    */\\n   void knotenHinzufuegen(String bezeichnung) {\\n      Knoten neuerKnoten \\u003d new Knoten(bezeichnung);\\n      knoten[anzKnoten] \\u003d neuerKnoten;\\n      anzKnoten \\u003d anzKnoten + 1;\\n   }\\n   \\n   /**\\n    * Fuegt eine gerichtete Kante dem Graphen hinzu\\n    * \\n    * @param start der Startknoten der Kante\\n    * @param ziel der Zielknoten der Kante\\n    * @param gewicht das Kantengewicht\\n    */\\n   void kanteHinzufuegen(String start, String ziel, int gewicht) {\\n      int startIndex \\u003d knotenFinden(start);\\n      int zielIndex \\u003d knotenFinden(ziel);\\n      kanten[startIndex][zielIndex] \\u003d gewicht;\\n   }\\n\\n   /**\\n    * Fuegt eine ungerichtete Kante dem Graphen hinzu\\n    * \\n    * @param k1 erster Nachbarknoten\\n    * @param k2 zweiter Nachbarknoten\\n    * @param gewicht das Kantengewicht\\n    */\\n   void ungerichteteKanteHinzufuegen(String k1, String k2, int gewicht) {\\n      kanteHinzufuegen(k1, k2, gewicht);\\n      kanteHinzufuegen(k2, k1, gewicht);\\n   }\\n\\n   /*******************************************************\\n    * Eigenschaften eines Graphen                         *\\n    *******************************************************/\\n\\n   /**\\n    * Zaehlt die ausgehenden Kanten eines Knotens\\n    * \\n    * @param bezeichnung die Bezeichnung des Knoten\\n    * @return die Anzahl der ausgehenden Kanten\\n    */\\n   int ausgehendeKantenZaehlen(String bezeichnung) {\\n      int knotenIndex \\u003d knotenFinden(bezeichnung);\\n      int anzahl \\u003d 0;\\n      for (int i \\u003d 0; i \\u003c anzKnoten; i++) {\\n         if(kanten[knotenIndex][i] !\\u003d -1) {\\n            anzahl \\u003d anzahl + 1;\\n         }\\n      }\\n      return anzahl;\\n   }\\n\\n   /**\\n    * Traversiert den Graphen mit der Breitensuche\\n    * \\n    * @param startKnotenBezeichnung die Bezeichnung des Startknotens\\n    * @return ein Feld das fuer jeden Knoten speichert wann er besucht wurde.\\n    */\\n   int[] breitensuche(String startKnotenBezeichnung) {\\n      int[] besuchsreihenfolge /* FIXME 1: initialisiere das Feld passend zur Anzahl der Knoten. */;\\n      int anzahlBesuchterKnoten \\u003d 1;\\n\\n      Warteschlange ausstehendeKnoten \\u003d new Warteschlange();\\n\\n      int startKnotenIndex \\u003d knotenFinden(startKnotenBezeichnung);\\n\\n      // TODO 1: Fuege den StartKnoten in die Warteschlange ein.\\n         \\n      // Markiere den Startknoten, indem er in besuchsreihenfolge als ersten besuchter Knoten vermerkt wird.\\n      besuchsreihenfolge[startKnotenIndex] \\u003d anzahlBesuchterKnoten;\\n\\n      while (false /* FIXME 2: Solange die Warteschlange NICHT leer ist */) {\\n         // TODO 3: Implementiere den Schleifenrumpf passend zu deinem Pseudocode.\\n         \\n         // Tipp: Ist ein Knoten bereits besucht, liefert dir die Bedingung besuchsreihenfolge[i] \\u003d\\u003d 0.\\n      }\\n\\n      return besuchsreihenfolge;\\n   }\\n}\\n\\nGraph g1 \\u003d new Graph(4);\\nfor (int i \\u003d 1; i \\u003c 5; i++) { g1.knotenHinzufuegen(\\\"v\\\" + i); }\\ng1.ungerichteteKanteHinzufuegen(\\\"v1\\\", \\\"v2\\\", 1);\\ng1.ungerichteteKanteHinzufuegen(\\\"v2\\\", \\\"v3\\\", 1);\\ng1.ungerichteteKanteHinzufuegen(\\\"v3\\\", \\\"v4\\\", 1);\\ng1.ungerichteteKanteHinzufuegen(\\\"v1\\\", \\\"v4\\\", 1);\\nint[] sollReihenfolge \\u003d { 1, 2, 4, 3 };\\n\\nprintln(\\\"Besuchsreihenfolge g1: \\\" + g1.breitensuche(\\\"v1\\\"));\\nif(!Arrays.equals(g1.breitensuche(\\\"v1\\\"), sollReihenfolge)) {\\n   println(\\\"Deine Breitensuche funktioniert noch nicht richtig.\\\");\\n   System.exit(1);\\n}\\n\\n\"},{\"id\":2497877,\"version\":1,\"filename\":\"Knoten\",\"path\":[],\"text\":\"class Knoten {\\n   String bezeichnung;\\n\\n   Knoten(String neueBezeichnung) {\\n      bezeichnung \\u003d neueBezeichnung;\\n   }\\n}\"},{\"id\":2497879,\"version\":1,\"filename\":\"Warteschlange\",\"path\":[],\"text\":\"class Warteschlange {\\n   ArrayList\\u003cInteger\\u003e schlange;\\n\\n   public Warteschlange() {\\n      this.schlange \\u003d new ArrayList\\u003cInteger\\u003e();\\n   }\\n\\n   /**\\n    * Fuegt eine Zahl der Warteschlange hinzu.\\n    * \\n    * @param i die zuhinzufuegende Zahl\\n    */\\n   void einfuegen(int i) {\\n      schlange.add(i);\\n   }\\n\\n   /**\\n    * Entfernt die erste Zahl der Warteschlange und gibt diese zurueck.\\n    * \\n    * @return die erste Zahl der Warteschlange\\n    */\\n   int erstenRausnehmen() {\\n      int i \\u003d schlange.get(0);\\n      schlange.remove(0);\\n      return i;\\n   }\\n\\n   /**\\n    * Gibt zureuck ob die Warteschlange leer ist.\\n    * \\n    * @return true falls die Warteschlange leer ist, false anderenfalls\\n    */\\n   boolean istLeer() {\\n      return schlange.isEmpty();\\n   }\\n}\"},{\"id\":2497892,\"version\":1,\"filename\":\"Arrays\",\"path\":[],\"text\":\"class Arrays {\\n   public static boolean equals(int[] a1, int[] a2) {\\n      if (a1.length !\\u003d a2.length) {\\n         return false;\\n      }\\n\\n      for (int i \\u003d 0; i \\u003c a1.length; i++) {\\n         if (a1[i] !\\u003d a2[i]) {\\n            return false;\\n         }\\n      }\\n\\n      return true;\\n   }\\n}\"}]",
   "history": "[{\"timestamp\":\"Tue Oct 21 16:37:42 CEST 2025\",\"version\":1,\"userId\":58291,\"username\":\"Florian.Fischer\",\"name\":\"Florian Fischer\",\"comment\":\"Initialer Commit\",\"isIntermediateEntry\":false,\"historyFiles\":[{\"id\":2497876,\"version\":1,\"type\":\"create\",\"filename\":\"Graph\",\"path\":[],\"content\":\"class Graph {\\n   // Attribut, das die aktuelle Anzahl an Knoten speichert\\n   int anzKnoten;\\n   // Knotenarray\\n   Knoten[] knoten;\\n   // Adjazenzmatrix\\n   int[][] kanten;\\n   \\n   /**\\n    * Erzeugt einen neuen Graphen.\\n    * \\n    * Der neue Graph hat Platz fuer maxAnzahlKnoten.\\n    * Er enthaelt nach der Initialisierung weder Knoten noch\\n    * Kanten.\\n    * @param maxAnzahlKnoten die maximale Anzahl an Knoten\\n    */\\n   Graph(int maxAnzahlKnoten) {\\n      // Initialisierung der Attribute\\n      anzKnoten \\u003d 0; // Der Graph enthaelt noch keine Knoten\\n      knoten \\u003d new Knoten[maxAnzahlKnoten];\\n      kanten \\u003d new int[maxAnzahlKnoten][maxAnzahlKnoten];\\n\\n      // Initialisierung der leeren Adjazenzmatrix\\n      for (int i \\u003d 0; i \\u003c maxAnzahlKnoten; i++) {\\n         for (int j \\u003d 0; j \\u003c maxAnzahlKnoten; j++) {\\n            kanten[i][j] \\u003d -1;\\n         }\\n      }\\n \\n   }\\n\\n   /**\\n    * Liefert die Bezeichnung eines Knoten\\n    * \\n    * @param knotenIndex der Index des Knoten\\n    * @return die Bezeichnung des Knoten\\n    */\\n   String knotenBezeichnungFinden(int knotenIndex) {\\n      Knoten knotenAnIndex \\u003d knoten[knotenIndex];\\n      return knotenAnIndex.bezeichnung;\\n   }\\n\\n   /**\\n    * Findet den Index eines Knoten anhand seiner Bezeichnung\\n    * \\n    * @param bezeichnung die Bezeichnung des Knoten\\n    * @return den Index des Knoten, -1 falls Knoten nicht gefunden\\n    */\\n   int knotenFinden(String bezeichnung) {\\n      for (int i \\u003d 0; i \\u003c anzKnoten; i++) {\\n         if(knoten[i].bezeichnung \\u003d\\u003d bezeichnung) {\\n            return i;\\n         }\\n      }\\n      return -1;\\n   }\\n\\n   /**\\n    * Fuegt einen neuen Knoten dem Graph hinzu\\n    * \\n    * @param bezeichnung die Bezeichnung des neuen Knoten\\n    */\\n   void knotenHinzufuegen(String bezeichnung) {\\n      Knoten neuerKnoten \\u003d new Knoten(bezeichnung);\\n      knoten[anzKnoten] \\u003d neuerKnoten;\\n      anzKnoten \\u003d anzKnoten + 1;\\n   }\\n   \\n   /**\\n    * Fuegt eine gerichtete Kante dem Graphen hinzu\\n    * \\n    * @param start der Startknoten der Kante\\n    * @param ziel der Zielknoten der Kante\\n    * @param gewicht das Kantengewicht\\n    */\\n   void kanteHinzufuegen(String start, String ziel, int gewicht) {\\n      int startIndex \\u003d knotenFinden(start);\\n      int zielIndex \\u003d knotenFinden(ziel);\\n      kanten[startIndex][zielIndex] \\u003d gewicht;\\n   }\\n\\n   /**\\n    * Fuegt eine ungerichtete Kante dem Graphen hinzu\\n    * \\n    * @param k1 erster Nachbarknoten\\n    * @param k2 zweiter Nachbarknoten\\n    * @param gewicht das Kantengewicht\\n    */\\n   void ungerichteteKanteHinzufuegen(String k1, String k2, int gewicht) {\\n      kanteHinzufuegen(k1, k2, gewicht);\\n      kanteHinzufuegen(k2, k1, gewicht);\\n   }\\n\\n   /*******************************************************\\n    * Eigenschaften eines Graphen                         *\\n    *******************************************************/\\n\\n   /**\\n    * Zaehlt die ausgehenden Kanten eines Knotens\\n    * \\n    * @param bezeichnung die Bezeichnung des Knoten\\n    * @return die Anzahl der ausgehenden Kanten\\n    */\\n   int ausgehendeKantenZaehlen(String bezeichnung) {\\n      int knotenIndex \\u003d knotenFinden(bezeichnung);\\n      int anzahl \\u003d 0;\\n      for (int i \\u003d 0; i \\u003c anzKnoten; i++) {\\n         if(kanten[knotenIndex][i] !\\u003d -1) {\\n            anzahl \\u003d anzahl + 1;\\n         }\\n      }\\n      return anzahl;\\n   }\\n\\n   /**\\n    * Traversiert den Graphen mit der Breitensuche\\n    * \\n    * @param startKnotenBezeichnung die Bezeichnung des Startknotens\\n    * @return ein Feld das fuer jeden Knoten speichert wann er besucht wurde.\\n    */\\n   int[] breitensuche(String startKnotenBezeichnung) {\\n      //int[] besuchsreihenfolge /* FIXME 1: initialisiere das Feld passend zur Anzahl der Knoten. */;\\n      int[] besuchsreihenfolge \\u003d new int[anzKnoten];\\n      int anzahlBesuchterKnoten \\u003d 1;\\n\\n      Warteschlange ausstehendeKnoten \\u003d new Warteschlange();\\n\\n      int startKnotenIndex \\u003d knotenFinden(startKnotenBezeichnung);\\n\\n      // TODO 1: Fuege den StartKnoten in die Warteschlange ein.\\n      ausstehendeKnoten.einfuegen(startKnotenIndex);\\n         \\n      // Markiere den Startknoten, indem er in besuchsreihenfolge als ersten besuchter Knoten vermerkt wird.\\n      besuchsreihenfolge[startKnotenIndex] \\u003d anzahlBesuchterKnoten;\\n\\n      while (!ausstehendeKnoten.istLeer() /* FIXME 2: Solange die Warteschlange NICHT leer ist */) {\\n         // TODO 3: Implementiere den Schleifenrumpf passend zu deinem Pseudocode.\\n         int knotenIndex \\u003d ausstehendeKnoten.erstenRausnehmen();\\n         for (int i \\u003d 0; i \\u003c anzKnoten; i++) {\\n            if(kanten[knotenIndex][i] !\\u003d -1 \\u0026\\u0026 besuchsreihenfolge[i] \\u003d\\u003d 0) {\\n               anzahlBesuchterKnoten++;\\n               besuchsreihenfolge[i] \\u003d anzahlBesuchterKnoten;\\n               ausstehendeKnoten.einfuegen(i);\\n            }\\n         }\\n      }\\n\\n      return besuchsreihenfolge;\\n   }\\n}\\n\\nGraph g1 \\u003d new Graph(4);\\nfor (int i \\u003d 1; i \\u003c 5; i++) { g1.knotenHinzufuegen(\\\"v\\\" + i); }\\ng1.ungerichteteKanteHinzufuegen(\\\"v1\\\", \\\"v2\\\", 1);\\ng1.ungerichteteKanteHinzufuegen(\\\"v2\\\", \\\"v3\\\", 1);\\ng1.ungerichteteKanteHinzufuegen(\\\"v3\\\", \\\"v4\\\", 1);\\ng1.ungerichteteKanteHinzufuegen(\\\"v1\\\", \\\"v4\\\", 1);\\nint[] sollReihenfolge \\u003d { 1, 2, 4, 3 };\\n\\nprintln(\\\"Besuchsreihenfolge g1: \\\" + g1.breitensuche(\\\"v1\\\"));\\nif (!Arrays.equals(g1.breitensuche(\\\"v1\\\"), sollReihenfolge)) {\\n   println(\\\"Deine Breitensuche funktioniert noch nicht richtig.\\\");\\n   System.exit(1);\\n}\\n\\n\",\"changeSet\":\"\"},{\"id\":2497877,\"version\":1,\"type\":\"create\",\"filename\":\"Knoten\",\"path\":[],\"content\":\"class Knoten {\\n   String bezeichnung;\\n\\n   Knoten(String neueBezeichnung) {\\n      bezeichnung \\u003d neueBezeichnung;\\n   }\\n}\",\"changeSet\":\"\"},{\"id\":2497879,\"version\":1,\"type\":\"create\",\"filename\":\"Warteschlange\",\"path\":[],\"content\":\"class Warteschlange {\\n   ArrayList\\u003cInteger\\u003e schlange;\\n\\n   public Warteschlange() {\\n      this.schlange \\u003d new ArrayList\\u003cInteger\\u003e();\\n   }\\n\\n   /**\\n    * Fuegt eine Zahl der Warteschlange hinzu.\\n    * \\n    * @param i die zuhinzufuegende Zahl\\n    */\\n   void einfuegen(int i) {\\n      schlange.add(i);\\n   }\\n\\n   /**\\n    * Entfernt die erste Zahl der Warteschlange und gibt diese zurueck.\\n    * \\n    * @return die erste Zahl der Warteschlange\\n    */\\n   int erstenRausnehmen() {\\n      int i \\u003d schlange.get(0);\\n      schlange.remove(0);\\n      return i;\\n   }\\n\\n   /**\\n    * Gibt zureuck ob die Warteschlange leer ist.\\n    * \\n    * @return true falls die Warteschlange leer ist, false anderenfalls\\n    */\\n   boolean istLeer() {\\n      return schlange.isEmpty();\\n   }\\n}\",\"changeSet\":\"\"},{\"id\":2497892,\"version\":1,\"type\":\"create\",\"filename\":\"Arrays\",\"path\":[],\"content\":\"class Arrays {\\n   public static boolean equals(int[] a1, int[] a2) {\\n      if (a1.length !\\u003d a2.length) {\\n         return false;\\n      }\\n\\n      for (int i \\u003d 0; i \\u003c a1.length; i++) {\\n         if (a1[i] !\\u003d a2[i]) {\\n            return false;\\n         }\\n      }\\n\\n      return true;\\n   }\\n}\",\"changeSet\":\"\"}]},\n{\"timestamp\":\"21.10.2025, 16:40\",\"version\":2,\"userId\":58291,\"username\":\"Florian.Fischer\",\"name\":\"Florian Fischer\",\"comment\":\"Entferne Implementierung und ergaenze einen Hinweis\",\"isIntermediateEntry\":false,\"historyFiles\":[{\"id\":2497876,\"version\":2,\"type\":\"change\",\"content\":\"[{\\\"diffs\\\":[[0,\\\"{\\\\n      \\\"],[-1,\\\"//\\\"],[0,\\\"int[] be\\\"]],\\\"start1\\\":3550,\\\"start2\\\":3550,\\\"length1\\\":18,\\\"length2\\\":16},{\\\"diffs\\\":[[0,\\\"*/;\\\\n\\\"],[-1,\\\"      int[] besuchsreihenfolge \\u003d new int[anzKnoten];\\\\n\\\"],[0,\\\"    \\\"]],\\\"start1\\\":3649,\\\"start2\\\":3649,\\\"length1\\\":61,\\\"length2\\\":8},{\\\"diffs\\\":[[0,\\\"in.\\\\n\\\"],[-1,\\\"      ausstehendeKnoten.einfuegen(startKnotenIndex);\\\\n\\\"],[0,\\\"    \\\"]],\\\"start1\\\":3882,\\\"start2\\\":3882,\\\"length1\\\":61,\\\"length2\\\":8},{\\\"diffs\\\":[[0,\\\"le (\\\"],[-1,\\\"!ausstehendeKnoten.istLeer()\\\"],[1,\\\"false\\\"],[0,\\\" /* \\\"]],\\\"start1\\\":4083,\\\"start2\\\":4083,\\\"length1\\\":36,\\\"length2\\\":13},{\\\"diffs\\\":[[0,\\\"    \\\"],[-1,\\\"int knotenIndex \\u003d ausstehendeKnoten.erstenRausnehmen();\\\\n         for (int i \\u003d 0; i \\u003c anzKnoten; i++) {\\\\n            if(kanten[knotenIndex][i] !\\u003d -1 \\u0026\\u0026 besuchsreihenfolge[i] \\u003d\\u003d 0) {\\\\n               anzahlBesuchterKnoten++;\\\\n               besuchsreihenfolge[i] \\u003d anzahlBesuchterKnoten;\\\\n               ausstehendeKnoten.einfuegen(i);\\\\n            }\\\\n         }\\\"],[1,\\\"\\\\n         // Tipp: Ist ein Knoten bereits besucht, liefert dir die Bedingung besuchsreihenfolge[i] \\u003d\\u003d 0.\\\"],[0,\\\"\\\\n   \\\"]],\\\"start1\\\":4240,\\\"start2\\\":4240,\\\"length1\\\":361,\\\"length2\\\":112},{\\\"diffs\\\":[[0,\\\"1\\\\\\\"));\\\\nif\\\"],[-1,\\\" \\\"],[0,\\\"(!Arrays\\\"]],\\\"start1\\\":4774,\\\"start2\\\":4774,\\\"length1\\\":17,\\\"length2\\\":16}]\"}]}",
   "description": "Einfache Implementierung der Breitensuche."
}