I
Ivan_aus_Berlin
Gast
Hallo,
ich versuche mich gerade ein wenig an JAVA und versuche ein Programm mithilfe von Rekursion zu schreiben, welches folgende Aufgabe bewältigen soll:
Das Programm soll alle möglichen Aufstellungen finden, bei der beliebige nxn Felder mit Pferden (Schach) vollgestellt werden, so dass auf jedem Feld ein Pferd steht, sich jedoch keines der Pferde gegenseitig bedroht.
Meine Idee war mir das erste freie Feld zu nehmen (Methode "freies") und dann dieses oder eines der Felder die dieses bedrohen (Methode "moegliche") mit einem Pferd zu besetzen. Dass soll solange wiederholt werden, bis kein freies Feld mehr da ist und die Positionen in Ergebnisse abspeichern.
<- es gibt kein freies feld mehr
Ich bastel jetzt schon ne ganze weile am code komme aber jetzt nicht mehr weiter.
Hier noch die verbale form meines codes:
ich rufe rekursion auf (die Übergabe von feld ist denke ich inzwischen überflüssig geworden)
ich erstelle mir ein freies spielfeld
ich blockiere alle felder auf denen ein Springer steht oder die ein Springer bedroht
ich setze M als mein nächstes freies Feld (wenn es keine freien Felder gibt, ist M=(-2,-2))
ich überprüfe ob ich fertig bin und speicher mein ergebnis in einer globalen Variable ab
wenn ich nicht fertig bin:
ich schaue ich mir die felder an, die als nächstes belegt werden könnten (msl)
für jedes Feld speicher ich es ab und rufe rekursion auf
hier kommt dann mein Problem, nachdem die rekrsion fertig ist, soll er das feld ja wieder wegnehmen, damit er die anderen felder probieren kann, wenn ich dass mache, landet in Ergebnisse nix. wenn ich das mit dem löschen des letzten einfach weglasse, schreibt er mir bei nem 8x8 feld 41 mal die selbe lange Liste mit Positionen in Ergebnisse rein.
Hier ist mein Quellcode für die Rekursion
bei bedarf kann ich auch gern den vollständigen code reinstellen. Ich hab jedoch alle untermethoden getesten und das programm läuft auch fehlerfrei. Leider macht es nur noch nicht was ich möchte.
ich versuche mich gerade ein wenig an JAVA und versuche ein Programm mithilfe von Rekursion zu schreiben, welches folgende Aufgabe bewältigen soll:
Das Programm soll alle möglichen Aufstellungen finden, bei der beliebige nxn Felder mit Pferden (Schach) vollgestellt werden, so dass auf jedem Feld ein Pferd steht, sich jedoch keines der Pferde gegenseitig bedroht.
Meine Idee war mir das erste freie Feld zu nehmen (Methode "freies") und dann dieses oder eines der Felder die dieses bedrohen (Methode "moegliche") mit einem Pferd zu besetzen. Dass soll solange wiederholt werden, bis kein freies Feld mehr da ist und die Positionen in Ergebnisse abspeichern.
Code:
(if ( (int)M.getFirst()==(-2) ) {Ergebnisse.add(Springer);})
Ich bastel jetzt schon ne ganze weile am code komme aber jetzt nicht mehr weiter.
Hier noch die verbale form meines codes:
ich rufe rekursion auf (die Übergabe von feld ist denke ich inzwischen überflüssig geworden)
ich erstelle mir ein freies spielfeld
ich blockiere alle felder auf denen ein Springer steht oder die ein Springer bedroht
ich setze M als mein nächstes freies Feld (wenn es keine freien Felder gibt, ist M=(-2,-2))
ich überprüfe ob ich fertig bin und speicher mein ergebnis in einer globalen Variable ab
wenn ich nicht fertig bin:
ich schaue ich mir die felder an, die als nächstes belegt werden könnten (msl)
für jedes Feld speicher ich es ab und rufe rekursion auf
hier kommt dann mein Problem, nachdem die rekrsion fertig ist, soll er das feld ja wieder wegnehmen, damit er die anderen felder probieren kann, wenn ich dass mache, landet in Ergebnisse nix. wenn ich das mit dem löschen des letzten einfach weglasse, schreibt er mir bei nem 8x8 feld 41 mal die selbe lange Liste mit Positionen in Ergebnisse rein.
Hier ist mein Quellcode für die Rekursion
Java:
public static void rekursion(boolean[][] feld, List<Tupel> Springer){
boolean[][] nf = new boolean[n][n];
for (int k=0;k<Springer.size();k++){
nf=belege(nf,Springer.get(k));
}
Tupel M = freies(nf);
if ( (int)M.getFirst()==(-2) ){
Ergebnisse.add(Springer);
}
else {
List<Tupel> msl = moegliche(nf,M);
for(int i=0;i<msl.size();i++){
Springer.add(msl.get(i));
rekursion(feld,Springer);
Springer.remove(Springer.size()-1);
}
}
}
bei bedarf kann ich auch gern den vollständigen code reinstellen. Ich hab jedoch alle untermethoden getesten und das programm läuft auch fehlerfrei. Leider macht es nur noch nicht was ich möchte.
Zuletzt bearbeitet von einem Moderator: