Acht-Damen-Problem HILFE!

G

gehweg

Gast
Hallo,

ich muss morgen ein Fachreferat über das acht-Damen-Problem halten und habe immense Schwierigkeiten den Quelltext zu verstehen. Hier ist also ein HILFERUF!!
Der Text sieht wie folgt aus:
[JAVA=42]
public class DamenproblemOhneThis {

//Attribute

int[][] feld; //Spielfeldmatrix (1-Dame, 0-freies Feld)
public static int lösungen = 0; //Anzahl der Lösungen

//Konstruktor
public DamenproblemOhneThis ()
{

feld = new int[8][8];
}
//Methoden
public void platziere(int zeile)
{
for(int spalte = 0; spalte < 8; spalte = spalte + 1)
{
feld[zeile][spalte] = 1;
if(korrektPlatziert())
if(zeile == 7)
{
ausgabe();
System.out.println("---------------");
DamenproblemOhneThis.lösungen = lösungen + 1;
}
else
platziere(zeile+1);

//Spalte wieder nullen
feld[zeile][spalte] = 0;
}
}

public void ausgabe()
{
for(int a = 0; a < 8; a = a + 1)
{
for(int b = 0; b < 8; b = b + 1)
System.out.print(feld[a]+" ");
System.out.println("");
}
}

public boolean korrektPlatziert()
{
boolean found = false;

//Überprüfen ob in jeder Zeile max. eine Dame steht
for(int a = 0; a < 8; a = a + 1)
{
found = false;
for(int b = 0; b < 8; b = b + 1)
{
if(feld[a] == 1)
if(found == false)
found = true;
else
return false;
}
}

//Überprüfen ob in jeder Spalte max. eine Dame steht
for(int b = 0; b < 8; b = b + 1)
{
found = false;
for(int a = 0; a < 8; a = a + 1)
{
if(feld[a] == 1)
if(found == false)
found = true;
else
return false;
}
}

//[links oben] -> [rechts unten] Diagonalen überprüfen
for(int zeile = 0; zeile < 8; zeile = zeile + 1)
{
found = false;
int spalte = 0;
while(zeile+spalte < 8)
{
if(feld[zeile+spalte][spalte] == 1)
if(found == false)
found = true;
else
return false;
spalte = spalte + 1;
}
}
for(int spalte = 1; spalte < 8; spalte = spalte + 1)
{
found = false;
int zeile = 0;
while(spalte+zeile < 8)
{
if(feld[zeile][spalte+zeile] == 1)
if(found == false)
found = true;
else
return false;
zeile = zeile + 1;
}
}

//[links unten] -> [rechts oben] Diagonalen überprüfen
for(int zeile = 7; zeile >= 0; zeile = zeile - 1)
{
found = false;
int spalte = 0;
while(zeile-spalte >= 0)
{
if(feld[zeile-spalte][spalte] == 1)
if(found == false)
found = true;
else
return false;
spalte = spalte + 1;
}
}
for(int spalte = 0; spalte <8; spalte = spalte + 1)
{
found = false;
int zeile = 0;
while(spalte+zeile < 8)
{
if(feld[8-zeile-1][spalte+zeile] == 1)
if(found == false)
found = true;
else
return false;
zeile = zeile + 1;
}
}
return true;
}



public static void main(String[] args)
{
DamenproblemOhneThis AQP = new DamenproblemOhneThis();
AQP.platziere(0);
System.out.println(DamenproblemOhneThis.lösungen+" Lösungen gefunden");
}
}

[/code]
 
G

gehweg

Gast
Ich habe nicht in allerletzte minute angefangen damit... aber davor habe ich eben gedacht dass der Quelltext viel einfacher zu verstehen ist, naja und jetzt steh ich da :D. Danke :). Euch auch einen schönen Freitag.
 

Landei

Top Contributor
Mit acht Damen hätte selbst ich ein Problem...

Aber für die kommenden Generationen: Der Code oben ist rekursiv und geht zeilenweise vor. Dabei wird in der Zeile eine Dame nacheinander an jede Stelle gesetzt und geprüft, ob die Stellung "erlaubt" ist (mit [c]korrektPlaziert[/c]).

Wenn ich eine Dame in der 8. Reihe korrekt platzieren konnte ([c]zeile == 7[/c] wegen nullbasiertem Array-Index), habe ich eine Lösung gefunden. Ansonsten mache ich (durch rekursiven Aufruf von [c]platziere[/c]) in der nächsten Zeile weiter.

Übrigens ein schönes Beispiel für Aufgaben, für die Java ziemlich schlecht geeignet ist. Auch wenn man obigen Code locker auf ein Viertel kürzen könnte, ist es noch eine ziemliche Lücke zu Haskell-Lösungen wie
Code:
queens n = map reverse $ queens' n where 
          queens' 0       = [[]]
          queens' k       = [q:qs | qs <- queens' (k-1), q <- [1..n], isSafe q qs]
          isSafe   try qs = not (try `elem` qs || sameDiag try qs)
          sameDiag try qs = any (\(colDist,q) -> abs (try - q) == colDist) $ zip [1..] qs
 
G

Gasssssssst

Gast
Eine frage, ich hoffe die ist Objektiv zu beantworten:
Wenn ich Haskal könnte, wäre der Code dann genauso leserlich wie der oben vorgestellte java code? (Ganz davon zu schweigen, das man in Haskal natürlich nicht durchgängig so programmiert (oder ;)))
 

Da_Tebe

Mitglied
Also bei mir war Haskel an der Uni Pflicht.
Nach ner Zeit konnte man das schon ganz gut verstehen, aber diese scheinbar endlos in sich geschachtelten Rekursionen werfen einem am Anfang auf jeden fall aus der Bahn.
 

Landei

Top Contributor
Eine frage, ich hoffe die ist Objektiv zu beantworten:
Wenn ich Haskal könnte, wäre der Code dann genauso leserlich wie der oben vorgestellte java code? (Ganz davon zu schweigen, das man in Haskal natürlich nicht durchgängig so programmiert (oder ;)))

Man kann in Haskell sehr leserlichen Code schreiben - ich denke sogar viel leserlicher als unser Java-Beispiel. Aber es ist sehr unterschiedlich, wie gut jemand mit den Abstraktionen zurecht kommt - manche kommen gut mit Funktionen höherer Ordnung, Algebraischen Datentypen, Typklassen u.s.w. klar, andere überhaupt nicht.

Ich habe auch das Gefühl, dass sich Haskell-Code während des Schreibens auch stärker verändert als in Java ("oh, hier sieht eine Comprehension besser aus, und diese Rekursion kann ich durch einen Fold ersetzen...") - jedenfalls bei mir.
 

Landei

Top Contributor
Mal ein Versuch, ganz von vorn eine Lösung zu schreiben:

Code:
isSafe x xs = notElem x xs && notDiag x xs succ && notDiag x xs pred where
  notDiag _ [] _ = True
  notDiag q (x:xs) f = x /= f q && notDiag (f q) xs f
  
queens n = queens' n [[]] where
  queens' 0 acc = acc
  queens' k qss = queens' (k-1) [q:qs | qs <- qss, q <- [0..(n-1)], isSafe q qs]

[c]isSafe[/c] sagt folgendes aus: Eine neue Dame ist "sicher", wenn die Spalte noch nicht in den vorhandenen Damen-Positionen vorkommt (
Code:
notElem
gibt es dafür schon "fertig") und auch nicht diagonal bedroht wird.
Code:
succ
und
Code:
pred
sind die Funktionen "um eins erhöhen / erniedrigen".
Code:
notDiag
verwendet einfache Rekursion, um alle Zeilen durchzugehen.

Code:
queens'
zählt im ersten Argument die gewünschten Zeilen herunter, das zweite Argument enthält alle bisher gefundenen gültigen Positionen.
Code:
queens'
ist wie
Code:
notDiag
explizit rekursiv. Der Code in den eckigen Klammern entspricht einer doppelt geschachtelten Schleife: Für alle gültigen Position und für alle Spalten von 0 bis n-1 füge eine Dame hinzu und schau nach, ob die Position immer noch gültig ist. Mein
Code:
queens'
sieht dem oben sehr ähnlich, hat aber eine andere Abfolge der Rekursion (ich arbeite mit Akkumulator, der Code oben ohne).

Für den ersten Versuch finde ich das recht lesbar. Allerdings würde man jetzt üblicherweise die Rekursionen z.B. durch Folds ersetzen, oder andere Tricks anwenden. [c]isSafe[/c] könnte man z.B. so schreiben:

Code:
isSafe x xs = all (notElem x) [xs, dg [1..], dg [-1,-2..]] where dg = zipWith (+) xs

Das ist zwar deutlich kürzer, aber auch schwerer zu verstehen. Der Trick ist hier, dass [c]dg[/c] die Positionen der bereits gefundenen Zeilen stufenweise "verschiebt" (je nach übergebener Liste nach links oder rechts), so dass wir zur Überprüfung der Diagonalen auch das vorhandene [c]notElem[/c] nutzen können.

Ich finde, wenn man weniger "fertige" Haskell-Lösungen zeigen würde, sondern öfter mal den Weg von einer Anfangslösung zum polierten Endprodukt (inklusive Sackgassen), würde ein guter Teil des Haskell-Mythos verpuffen, und es wäre viel leichter, sich die ganzen Tricks abzuschauen.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Damen-Spiel Spiele- und Multimedia-Programmierung 4
A [HILFE] - Minecraft-Problem! Spiele- und Multimedia-Programmierung 1
C Plugin Problem Spiele- und Multimedia-Programmierung 2
J JLayer Problem Spiele- und Multimedia-Programmierung 1
Meeresgott LWJGL 3 Problem mit einer Texture Spiele- und Multimedia-Programmierung 4
G Low Poly 3D LWJGL Shader Problem Spiele- und Multimedia-Programmierung 4
O Problem beim Aufrufen des Spiels von einem Menü Spiele- und Multimedia-Programmierung 7
G LIBGDX Texturen Problem Spiele- und Multimedia-Programmierung 1
G LIBGDX Problem beim resizen des Frames Spiele- und Multimedia-Programmierung 3
C AutoClicker Problem Spiele- und Multimedia-Programmierung 2
S OOP Logik Problem Spiele- und Multimedia-Programmierung 5
G LIBGDX Viewport Problem Spiele- und Multimedia-Programmierung 3
J Problem mit Game Of Life Spiele- und Multimedia-Programmierung 3
N Problem mit 2D Spiel Spiele- und Multimedia-Programmierung 17
C Minecraft Minecraft Plugin Problem Spiele- und Multimedia-Programmierung 17
R Pong Spiel Problem Spiele- und Multimedia-Programmierung 1
V Problem mit BufferStrategy Spiele- und Multimedia-Programmierung 2
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
E A-Stern Algorithmus Problem und Implementierung einer Map Spiele- und Multimedia-Programmierung 6
T LWJGL 2.9.2: Seltsamer Effekt beim Rendern (VertexShader Problem?) Spiele- und Multimedia-Programmierung 3
W Generelles Problem: Entscheidungsfindung Spiele- und Multimedia-Programmierung 4
T Problem bei Kollisionsabfrage Spiele- und Multimedia-Programmierung 4
C Vier Gewinnt Problem mit Ordnerstruktur Spiele- und Multimedia-Programmierung 2
T Problem mit Eclipse (java)-(minecraft) Spiele- und Multimedia-Programmierung 3
I Textbasiertes Spiel - Umsetzungsfrage & Schleifen Problem Spiele- und Multimedia-Programmierung 26
M Sound Problem Spiele- und Multimedia-Programmierung 3
T Problem beim Aufbau des Spielfelds Spiele- und Multimedia-Programmierung 18
M Sound Engin Problem 2 Spiele- und Multimedia-Programmierung 2
J Problem bei der GUI - Zu viele Spielbretter Spiele- und Multimedia-Programmierung 2
D LWJGL gluLookAt "Umschauen" Problem Spiele- und Multimedia-Programmierung 0
D Problem mit Würfelanimierung in LWJGL Spiele- und Multimedia-Programmierung 7
C Zeldaklon Problem mit Wand-Kollision Spiele- und Multimedia-Programmierung 8
0 Boxen übereinander stapelt Problem Spiele- und Multimedia-Programmierung 5
D Textfield im Game ,Problem: while-Schleife Spiele- und Multimedia-Programmierung 3
R 2D platformer - enemy damage -> TIMER PROBLEM Spiele- und Multimedia-Programmierung 3
S LWJGL Kamera Problem - Alles verzerrt Spiele- und Multimedia-Programmierung 4
B LWJGL StackOverFlow Problem nach 30sekunden. (Pong) Spiele- und Multimedia-Programmierung 2
Seikuassi LWJGL-Problem Spiele- und Multimedia-Programmierung 2
L Minecraft Minecraft Plugin programmieren (Craftbukkit 1.7.2) Problem Spiele- und Multimedia-Programmierung 4
B Minecraft mehr Ram zuweißen Problem Spiele- und Multimedia-Programmierung 0
K Bukkit Plugin Problem Spiele- und Multimedia-Programmierung 3
Y Problem mit repaint() in run() Spiele- und Multimedia-Programmierung 2
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1
T Problem mit Kollisionsabfrage der NPC Spiele- und Multimedia-Programmierung 1
J Minecraft Problem mit dem JRE - Minecraft Spiele- und Multimedia-Programmierung 3
TheSorm Problem mit 2 classen NullPointerException Spiele- und Multimedia-Programmierung 1
S Problem mit 4 gewinnt(MinMax Algorithmus) Spiele- und Multimedia-Programmierung 2
N Problem in der Main.class Spiele- und Multimedia-Programmierung 1
J Blöcke, Hitboxen, Koolisionsabfrage - Problem Spiele- und Multimedia-Programmierung 8
S Problem mit 3d-Polygon Spiele- und Multimedia-Programmierung 2
A Problem mit Sound Spiele- und Multimedia-Programmierung 5
C Nxt Duell Problem Spiele- und Multimedia-Programmierung 4
F LWJGL Problem mit Erstellen eines Objekts und der Kamera Spiele- und Multimedia-Programmierung 5
ruerob Problem bei Fade-Out von Sounds Spiele- und Multimedia-Programmierung 3
L [Slick2D] Problem bei Speicherfreigabe Spiele- und Multimedia-Programmierung 2
M Bukkit Plugin Problem Spiele- und Multimedia-Programmierung 22
T Java3D Rendering Problem Spiele- und Multimedia-Programmierung 7
J Problem bei pixelgenauer Kollisionsabfrage Spiele- und Multimedia-Programmierung 10
F Problem mit dem Abspielen von byte[] (Audioprogrammierung) Spiele- und Multimedia-Programmierung 2
C Problem mit Abspielen von Audio-Dateien Spiele- und Multimedia-Programmierung 3
R Problem bei Farbe ändern/4Gewinnt Spiele- und Multimedia-Programmierung 5
R StringIndexOutOfBoundsException - Problem Spiele- und Multimedia-Programmierung 2
S Problem mit Sichtfeld/Licht in einem Raster Spiele- und Multimedia-Programmierung 5
A TileMap KeyListener - Problem Spiele- und Multimedia-Programmierung 2
J Problem mit Threads Spiele- und Multimedia-Programmierung 8
N Problem mit Kollisionsabfrage beim Fallen Jump & Run Spiele- und Multimedia-Programmierung 5
S Problem mit Zeitsteuerung der Game Loop Spiele- und Multimedia-Programmierung 4
Fu3L Problem mit 3D Noise Spiele- und Multimedia-Programmierung 4
L Problem beim Rätsellöser Spiele- und Multimedia-Programmierung 3
D Problem beim bewegen einer Figur Spiele- und Multimedia-Programmierung 2
T Problem bei LinkedList / JPanel Spiele- und Multimedia-Programmierung 4
T Problem mit ClassLoader und LWJGL Spiele- und Multimedia-Programmierung 5
M Scrolling Repaint Problem Spiele- und Multimedia-Programmierung 2
Samake03 [Problem] layeredPane bzw. Viewport Spiele- und Multimedia-Programmierung 3
Helgon glTexParameter / glTexImage2D Problem Spiele- und Multimedia-Programmierung 11
T Jmonkey opengl problem Spiele- und Multimedia-Programmierung 13
M Problem mit Kamera (glMultMatrix (OpenGL/ LWJGL)/ Quaternionen) Spiele- und Multimedia-Programmierung 5
M Problem mit Gameserver / Datensynchronisation Spiele- und Multimedia-Programmierung 10
G Mein erstes minigame -> problem mit Methode Spiele- und Multimedia-Programmierung 3
X Geometry Wars Clone Problem Spiele- und Multimedia-Programmierung 4
H Problem mit JMonkeyEngine3 und OgreXML Spiele- und Multimedia-Programmierung 3
D [JOGL 2.0] Kleines Problem mit freier Flugsteuerung Spiele- und Multimedia-Programmierung 3
A JAVA3D TransformGroup <--> Group Problem Spiele- und Multimedia-Programmierung 3
U [JOGL 1.1.1a]Kleines Problem mit Text Overlays: Spiele- und Multimedia-Programmierung 19
T Problem mit JnR-Steuerung / KeyListener Spiele- und Multimedia-Programmierung 6
D Problem Mit Miensweeper Clone & rekursive Methode Spiele- und Multimedia-Programmierung 4
M Performance Problem bei BufferedImage Spiele- und Multimedia-Programmierung 7
T Problem mit Speicherverbrauch Spiele- und Multimedia-Programmierung 5
S Programmstruktur Problem! Spiele- und Multimedia-Programmierung 8
BattleMaster246 Problem mit Jogl Spiele- und Multimedia-Programmierung 14
C MP3 Handler-Problem Spiele- und Multimedia-Programmierung 13
C [gelöst] MP3-Codec-Problem Spiele- und Multimedia-Programmierung 2
K Schiebepuzzle Array Zufallszahlen Problem Spiele- und Multimedia-Programmierung 8
J Java 3D Problem Spiele- und Multimedia-Programmierung 2
G Eclipse Problem mit Java3d Spiele- und Multimedia-Programmierung 3
H Repaint-Problem mit Quaxlis Tutorial Spiele- und Multimedia-Programmierung 2
C Java Sound API Clip.Close() Problem Spiele- und Multimedia-Programmierung 1
K Problem beim Anzeigen von Bildern Spiele- und Multimedia-Programmierung 5
D Problem mit Überprüfung beim Lottospiel Spiele- und Multimedia-Programmierung 6
D Problem beim Öffnen einer PHP für eine Highscore Spiele- und Multimedia-Programmierung 5

Ähnliche Java Themen

Neue Themen


Oben