n Damenproblem

alb

Mitglied
hi, ich soll das n-damenproblem lösen. ich habe dabei ein problem bei einer methode.
ich soll das mithilfe der klassen board und queensproblem lösen.

hier ist der code für die klasse board:
Java:
public class Board {
	private final int[] board;
	private final int numberOfRows;

	public Board(int numberOfRows) {
		this(0, numberOfRows);
	}

	private Board(int numberOfColumns, int numberOfRows) {
		this.board = new int[numberOfColumns];
		this.numberOfRows = numberOfRows;
	}

	public int getNumberOfColumns() {
		return board.length;
	}

	public boolean isEmpty() {
		return board.length == 0;
	}
        
      // diese methode testet, ob es in der momentanen damenkonstellation konflikte gibt
	public boolean hasConflict() {
		for (int i = 0; i < board.length; i++) {
			// testet ob, die damen in der gleichen reihe sind
			for (int j = 0; j < board.length; j++) {
				if ((i != j) && (board[i] == board[j]) && board[i] != 0) {
					return true;
				}
			}
// hier sollte man testen, ob die dame diagonal bedroht wird
		}
		return false;
	}

mein problem bezieht sich auf die methode hasConflict. ich habe es geschafft zu testen, ob die damen sich in der selben reihe befinden, allerdings weiß ich nicht, wie ich die möglichen diagonalen bedrohungen filtern soll. hätte da einer/eine eine idee ? vielen dank im voraus
 

AquaBall

Top Contributor
Im Prinzip gleich wie eine Abfrage auf der Geraden.
Der SpaltenIndex ist halt nur im die Anzahl der Zeilen versetzt.

Das Problem ist nur, dass ich dein hasConflict nicht kapiere, weil du ja gar kein Feld hast?!?
Dein Board sieht für mich äußerst linear aus.


Ich glaube da kann noch nichts daran funktionieren!
Ich glaube da fehlt ein zweiter Index:
Code:
board[zeile][spalte]

ch habe es geschafft zu testen, ob die damen sich in der selben reihe befinden,
Das bezweifle ich!
(zumindest kapier ichs nicht)
 

Marco13

Top Contributor
Ist es üblich, das Spielfeld da nur über die Spalten zu modellieren? Naja, reicht für das eigentliche Problem ja...

Die innere Schleife könnte bei i+1 statt bei 0 loslaufen, das spart Arbeit und den ersten Teil der if-Abfrage.

Zu den Diagonalen: Wenn man in Spalte x0 in Zeile y0 steht, und die gerade mit Spalte x1 vergleicht, dann sind die Felder in dieser Spalte, die auf den von x0,y0 ausgehenden Diagonalen liegen, gerade die Felder (x1, y0+(x1-x0)) und (x1, y0-(x1-x0)) (Arraygrenzen beachten!). (Was man machen muss, damit man DANN noch bei i+1 loslaufen kann, müßte ich erst überlegen)
 

alb

Mitglied
sorry, hab meinen code nicht erklärt.
war mein erster beitrag

mein board ist ein eindimensionales array (ist so vorgegeben). die anzahl der arrayfelder gibt die anzahl der spalten an. der eintrag gibt die position der dame in der jeweiligen spalte an.
beispiel: board[0] = 3.
bedeutet: in der ersten spalte von meinem spielfeld in der 4. reihe (man zählt ja ab 0) befindet sich eine dame.
 

AquaBall

Top Contributor
Aha!
Konzept verstanden!


Gefällt mir als Schachspieler gar nicht
(Obwohl ich erkennen muss, dass es für dieses Problem so üblich zu sein scheint)
1) Wenn schon dieses Konzept, dann heißt die Variable nicht
Code:
board
, sondern
Code:
spalte
denn die Bedeutung von spalte[n]=x heißt: In Spalte 'n' steht (irgendeine?) Figur auf der 'x'
Übrigens: Zitat: "(man zählt ja ab 0)" spalte[n]=0 heißt in der 1. Zeile, ok; Aber wie wird dann eine leere Spalte erkannt?
2) Das Wesen des Problems geht verloren.
- - > Es hat mit einem Schachtbrett nicht mehr viel zu tun.
3) extreme Einschränkung der Funktionalität, es kann nur 1 FigurenTyp auf dem Brett stehen.
- - > Die Aufgabenstellung kann nicht modifiziert werden: (z.B. tausche 1 Dame gegen 1 Turm)
4) Unrealistisch, weil: es KANN (nicht "darf"!) nur eine Figur in 1 Spalte stehen!
- - > Ich kann weder "versuchshalber" eine zweite Figur in die selbe Spalte stellen,
z.b. "Wenn hier noch eine Dame stehen würde, wie oft würde sie dann bedroht?"
- - > noch kann ich mit einem anderen FigurenTyp außer Turm und Dame arbeiten, weil alle anderen Figuren sehr wohl in der selben Spalte stehen können.
- - > Die Aufgabenstellung kann nicht modifiziert werden: (z.B. tausche die Damen gegen Läufer)
5) Symmetrie geht verloren! Sehr wichtig!
- - > In einer Spalte KANN nur 1 Figur stehen, in 1 Zeile sind aber beliebig viele möglich.
Das eine ist technisch gar nicht möglich das andere muss mühsam geprüft werden.
Es ist auch gar nicht klar, ob mit
Code:
board
nun 1 Spalte (im Schach=Linie) oder 1 Zeile (im Schach=Reihe) gemeint ist.


Mag sein, dass die Aufgabe so gestellt wurde, aber bei diesen massiven Einschränkungen und Ungenauigkeiten ist es einfacher, ein jpeg einzubetten. Das spezifische Problem wurde schon oft genug gelöst und mit programmatorischen Umgang mit einem Schachbrett hat es nichts mehr zu tun.

Gerade für Übungsbeispiele soll es wesentliches Konzept sein, dass das Problem dahinter verallgemeinert, aber nicht verbogen wird. Und das Wesen eines Schachproblems ist eben allgemein: "Eine bestimmte Figur steht auf auf Feld A3"

Mir gefällts nicht.
 

alb

Mitglied
die attribut und klassenamen sowie die get und konstruktor-sachen sind so von der aufgabenstellung vorgegeben, dafür kann ich nichts.
ich habe mir das übungsblatt noch einmal genau durchgelesen. es steht tatsächlich drin, dass man ab 0 zählen soll, was aber unlogisch ist, da ein leeres arrayfeld aus int mit 0en gefüllt wird und ich dann schwer feststellen kann, ob mein board ("schachbrett") leer ist oder ne dame in der ersten reihe hat. daher habe ich das geändert.
also: board[0] = 1. bedeutet: in der ersten spalte, erste reihe befindet sich ne dame.
 
N

nillehammer

Gast
also: board[0] = 1. bedeutet: in der ersten spalte, erste reihe befindet sich ne dame.
Bei 0 loszählen finde ich als Programmierer jetzt erstmal logisch. Als Code für "keine Dame in Spalte" würde ich eher
Code:
-1
wählen. Das entspricht der Konvention der indexOf-Methoden bspw. in List oder String. Oder Du machst statt einem Primitive-Array einen Array mit Wrappern. Also:
Java:
private final Integer[] board;
Dann kann Dein Array null-Werte enthalten. Das wäre noch sprechender.
 

Ähnliche Java Themen

Neue Themen


Oben