M
maglite
Gast
Ich bin momentan mit einem Problem überfordert:
Hier gibts n lustiges Flashspiel, und ich wollte um meine Java-Kenntnisse wieder auzufrischen dafür eine Lösung programmieren.
Lösungsidee: Fasse die Seerosen als ein zweidimensionales Knotengitter auf und gehe nach dem Trial-and-Error - Prinzip vor, bis eine passende Folge von "Froschsprüngen" vorliegt. Ich will nicht alle 200 Zeilen Code posten, deshalb hoffe ich, das Wesentliche an meinem Problem erläutern zu können:
Ich rufe als Rekursions-Prozedur Gehe(...) auf, in der ich folgende Parameter übergebe:
-- das jeweilige aktuelle zweidimensionale Array tempFeld mit Notation von schon besuchten bzw. nicht vorhandenen Knoten und noch vorhandenen Knoten
-- die Koordinaten der aktuellen Position tempX und tempY
-- die Richtung tempRichtung, in die der letzte Sprung stattfand
-- tempKnotenAnzahl als Überprüfunsvariable, ob alle Knoten besucht worden sind oder nicht
-- ein String tempFolge als Aneinanderreihung der einzelnen Knoten-Koordinaten als Lösungsfolge:
Der gesamte Code ist sowohl syntaktisch als auch semantisch korrekt, bis auf eine Ausnahme:
Das übergebene tempFeld macht Schwierigkeiten: Wenn sich der Algorithmus durch eine falsche Reihenfolge festgefahren hat, springt er (logisch) eine Rekursionstiefe zurück. Dies geschieht auch korrekt, nachweisbar durch probeweise Ausgabe der Variable tempKnotenAnzahl, die sich je nach Tiefe verringert oder erhöht.
Aber das Array tempFeld wird nicht für jeden Rekursionsschritt übernommen, d.h.:
Alg. hat Sackgasse erwischt, er kann nicht weiter, weder nach oben, unten, rechts oder links, er springt also eine Rek.-tiefe zurück, hat da aber nicht mehr den Knoten verfügbar, den er im Schritt zuvor in der Sackgasse als benutzt abgehakt hat.
Meine Frage: kann jmd. aus diesem Code-Schnipsel erkennen, warum der Alg. jede (!) Variable außer tempFeld korrekt übernimmt, das tempFeld aber anscheinend als globale Variable behandelt?
Ich weiß, viel Code, aber ein großen Danke im Voraus ;-).
Gruß, Maglite
Hier gibts n lustiges Flashspiel, und ich wollte um meine Java-Kenntnisse wieder auzufrischen dafür eine Lösung programmieren.
Lösungsidee: Fasse die Seerosen als ein zweidimensionales Knotengitter auf und gehe nach dem Trial-and-Error - Prinzip vor, bis eine passende Folge von "Froschsprüngen" vorliegt. Ich will nicht alle 200 Zeilen Code posten, deshalb hoffe ich, das Wesentliche an meinem Problem erläutern zu können:
Ich rufe als Rekursions-Prozedur Gehe(...) auf, in der ich folgende Parameter übergebe:
-- das jeweilige aktuelle zweidimensionale Array tempFeld mit Notation von schon besuchten bzw. nicht vorhandenen Knoten und noch vorhandenen Knoten
-- die Koordinaten der aktuellen Position tempX und tempY
-- die Richtung tempRichtung, in die der letzte Sprung stattfand
-- tempKnotenAnzahl als Überprüfunsvariable, ob alle Knoten besucht worden sind oder nicht
-- ein String tempFolge als Aneinanderreihung der einzelnen Knoten-Koordinaten als Lösungsfolge:
Code:
public static void Gehe(char[][] tempFeld, int tempX, int tempY, char tempRichtung, int tempKnotenAnzahl, String tempFolge) {
if (tempKnotenAnzahl <= knotenAnzahl) {
tempKnotenAnzahl += 1;
tempFolge += tempX + "," + tempY + " ";
// Versuch nach oben zu Hüpfen
if (***Knoten über dem aktuellen ist verfügbar***) {
tempFeld[tempX][tempY] = ***wird durch char abgehakt***;
Gehe(tempFeld, tempX, ***Y-Koordinate des nächstexistierenden Punktes***, 'o', tempKnotenAnzahl, tempFolge);
}
// Versuch nach rechts zu Hüpfen
if (***Knoten rechts vom aktuellen ist verfügbar***) {
tempFeld[tempX][tempY] = ***wird durch char abgehakt***;
Gehe(tempFeld, ***X-Koordinate des nächstexistierenden Punktes***, tempY, 'r', tempKnotenAnzahl, tempFolge);
}
// Versuch nach unten zu Hüpfen
if (***Knoten unter dem aktuellen ist verfügbar***) {
tempFeld[tempX][tempY] = ***wird durch char abgehakt***;
Gehe(tempFeld, tempX, ***Y-Koordinate des nächstexistierenden Punktes***, 'u', tempKnotenAnzahl, tempFolge);
}
// Versuch nach links zu Hüpfen
if (***Knoten links vom aktuellen ist verfügbar***) {
tempFeld[tempX][tempY] = ***wird durch char abgehakt***;
Gehe(tempFeld, ***X-Koordinate des nächstexistierenden Punktes***, tempY, 'l', tempKnotenAnzahl, tempFolge);
}
} else {
System.out.println("Folge: " + tempFolge);
fertig = true;
}
Der gesamte Code ist sowohl syntaktisch als auch semantisch korrekt, bis auf eine Ausnahme:
Das übergebene tempFeld macht Schwierigkeiten: Wenn sich der Algorithmus durch eine falsche Reihenfolge festgefahren hat, springt er (logisch) eine Rekursionstiefe zurück. Dies geschieht auch korrekt, nachweisbar durch probeweise Ausgabe der Variable tempKnotenAnzahl, die sich je nach Tiefe verringert oder erhöht.
Aber das Array tempFeld wird nicht für jeden Rekursionsschritt übernommen, d.h.:
Alg. hat Sackgasse erwischt, er kann nicht weiter, weder nach oben, unten, rechts oder links, er springt also eine Rek.-tiefe zurück, hat da aber nicht mehr den Knoten verfügbar, den er im Schritt zuvor in der Sackgasse als benutzt abgehakt hat.
Meine Frage: kann jmd. aus diesem Code-Schnipsel erkennen, warum der Alg. jede (!) Variable außer tempFeld korrekt übernimmt, das tempFeld aber anscheinend als globale Variable behandelt?
Ich weiß, viel Code, aber ein großen Danke im Voraus ;-).
Gruß, Maglite