Methoden Backtracking

T

theawak3r

Gast
Ich werde gleich wahnsinnig... Wollte mal aus Spass per Backtracking ein Sudoku lösen lassen, allerdings bekomme ich es nicht hin.. Hier mal die entsprechende Methode:

Java:
public Spielfeld solve() throws SolveException {

		int zeile = this.i / 9;
		int spalte = this.i % 9;
		Feld feld = this.spielfeld.getFeld(zeile, spalte);

		if (this.i < 81) {

			if (feld.getInit()) {
				if (this.richtung) {
					this.i = this.i + 1;
					this.solve();
				} else {
					this.i = this.i - 1;
					this.solve();
				}

			} else {

				if (feld.getValue() == 9) {
					feld.setValue(0);
					this.i = this.i - 1;
					this.richtung = false;
					this.solve();

				} else {

					if (this.istGueltigerSchritt(zeile, spalte,
							feld.getValue() + 1)) {
						feld.setValue(feld.getValue() + 1);
						this.i = this.i + 1;
						this.richtung = true;
						this.solve();
					} else {
						feld.setValue(feld.getValue() + 1);
						this.richtung = true;
						this.solve();
					}
				}
			}
		}
		return this.spielfeld;
	}

Ich weiß viel if, wollte ich eigentlich alles noch mit State Pattern schöner machen, allerdings erst wenn es läuft.
Das Problem ist, die Methode für this.i ~ 50 sauber durchläuft.. Alles was danach kommt, wirft eine Overflow Exception. Kann mir bitte mal jemand sagen wieso die geworfen wird, der alleinige rekursive aufruf der Methode kann doch nicht dafür verantwortlich sein, dass der Speicher volläuft -.-"
 

setsuna9

Mitglied
naja, du machst ja nichts anderes als
Java:
public static int anzahlAufruf = 0;
public boolean method(){
  anzahlAufruf++;
  System.out.println(anzahlAufruf);
  if (nochNichtGeloest()){
    method();
  }
 return true;
}

Bei mir steigt das Programm beim 7386sten Aufruf von method() aus.
Dein [c]i[/c] wird bestimmt zwischen 1 und 81 hin- und heroszillieren, bis der StackOverflowError kommt
 
T

theawak3r

Gast
Hmm so sompel und doch so effektiv, dann muss ich mir wohl eine andere Strategie überlegen.. Danek erstmal :)
Kann mir irgendwer ein Tipp geeben, wie ich das ohne so viele rekrusive aufrufe schafe? ;)
 

Ähnliche Java Themen


Oben