Backtracking Schach

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.
Code:
(if ( (int)M.getFirst()==(-2) ) {Ergebnisse.add(Springer);})
<- 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

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:
S

SlaterB

Gast
> Ergebnisse.add(Springer);
hier musst du wahrscheinlich eine Kopie anlegen,
womöglich reicht bereits
> Ergebnisse.add(new ArrayList(Springer));

Variablen klein schreiben!

wofür übergibst du den Parameter feld, wird nirgendwo genutzt?
jedesmal ein neues 2D-Array ist aber in der Tat unschön, fülle lieber das nach und nach, dazu remove einzelner Positionen und als Ergebnis kopieren

die Aufgabe habe ich persönlich noch nicht verstanden, werden Springer von Schwarz und Weiß gesetzt oder nur eine Farbe?
sind am Ende alle 64 Felder mit Springern befüllt oder wie definiert sich 'kein freies Feld', 'mit Pferden (Schach) vollgestellt werden, so dass auf jedem Feld ein Pferd steht' usw?
wozu dann Rekursion, warum nicht alle 64 Felder voll und fertig, was wird überhaupt gesucht, was ist mit der Bedrohung?
aber auch egal ;)
 

Bleiglanz

Gesperrter Benutzer
Wollte das schon die ganze Woche als Fingerübung erledigen.

Dabei findet mein Programm immer Lösungen, bei denen 32 Springer alle auf Feldern gleicher Farbe bestehen, sagen wir 32 schwarze Springer.

Klar dass die sich nicht gegenseitig bedrohen, ein schwarzer Springer kann nur weiße Felder bedrohen.

Und mehr als 32 Springer kann man auch nicht hinstellen wegen eines 4x2 Arguments (in einem 4x2 Teilrechteck haben maximal 4 Springer Platz, jeder besetzt 1 und bedroht 1...)

Frage: gibt es überhaupt Lösungen mit 32 Springern, wenn diese nicht alle auf der gleichen Farbe stehen?
 
S

SlaterB

Gast
bestimmt nicht, mathematisch versiert gesprochen ;)
zwei benachbarte Springer hinterlassen ein desaströses (Schlacht)Feld/Brett von bis zu 16 gesperrten Feldern,
die sollten sich schon besser alle überlappen

keine große Hürde ist wohl das (augenscheinliche) Maximum von gleichzeitig auf den Spielfeld vorhandenden Schwarzfeld- + Weißfeld-Springern gleicher Anzahl,
gibt zusammen bei mir eine weihnachtliche Zahl, dann kann man es erwähnen ;)
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Max246Sch 3D Box Filler BAcktracking Java Basics - Anfänger-Themen 1
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
districon Backtracking Java Basics - Anfänger-Themen 2
districon Backtracking Java Basics - Anfänger-Themen 14
districon Dynamisch Programmierung/Backtracking/Memoization Java Basics - Anfänger-Themen 3
districon Backtracking funktioniert nicht ganz Java Basics - Anfänger-Themen 3
V Backtracking und Rekursion Java Basics - Anfänger-Themen 15
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
O Backtracking Java Basics - Anfänger-Themen 5
C Rekursives Backtracking beim Spiel Peg Java Basics - Anfänger-Themen 22
A Backtracking Java Basics - Anfänger-Themen 56
R Backtracking Java Basics - Anfänger-Themen 1
V Feld sortieren mit Backtracking Java Basics - Anfänger-Themen 1
A Sudoku mit Backtracking lösen Java Basics - Anfänger-Themen 3
L Sudoku Backtracking Pseudocode Java Basics - Anfänger-Themen 3
N Backtracking - Labyrinth/Irrgarten Java Basics - Anfänger-Themen 14
L Magisches Quadrat und Backtracking Java Basics - Anfänger-Themen 19
M Backtracking/Solve Methode Java Basics - Anfänger-Themen 7
P Labyrinth, Backtracking, verzögerte Anzeige Java Basics - Anfänger-Themen 15
D Sudoku lösen mit Backtracking Java Basics - Anfänger-Themen 20
E backtracking und Induktionsprinzip Java Basics - Anfänger-Themen 2
D Backtracking Waage Problem Java Basics - Anfänger-Themen 23
N Backtracking Solohalma Java Basics - Anfänger-Themen 2
W Backtracking und Frustration Java Basics - Anfänger-Themen 6
X Sudoku Backtracking Java Basics - Anfänger-Themen 6
J Solitaire via Backtracking Java Basics - Anfänger-Themen 7
A Backtracking - kennt Java keine Rücksprungmarken? Java Basics - Anfänger-Themen 15
G Backtracking mit globaler Variable Java Basics - Anfänger-Themen 5
M BackTracking Java Basics - Anfänger-Themen 22
J Backtracking Algorithmus Java Basics - Anfänger-Themen 16
M Schach Diagonalerichtung Java Basics - Anfänger-Themen 2
Hias12345 Schach(Springer Logik) Java Basics - Anfänger-Themen 27
G Schach -Frage 2- Maussteuerung Java Basics - Anfänger-Themen 7
G Schach in Java - Allgemeine Frage zur Architektur Java Basics - Anfänger-Themen 7
S Schach Frontend programmieren Java Basics - Anfänger-Themen 2
E Schach in Java-Applet <No main classes found> Java Basics - Anfänger-Themen 5
C Schach(matt) setzen Java Basics - Anfänger-Themen 13
T Springer Problem - Schach Java Basics - Anfänger-Themen 4
O Schach programmieren mit java Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben