{ "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." }