8Damen Problem

Malaxo

Erfahrenes Mitglied
Hey Leute
Mein erstes eigen Projekt in Java. Nun komm ich nicht weiter. 8Damen Problem:Setzte auf einem Schachbrett 8x8 - 8 Damen die sich nicht stören können (waagrecht / senkrecht / diagonal)

Nun schaff ich die Diagonale nicht.

Hab zahlreiche Lösungen gefunden im Netzt jedoch will ich diese auf meinen Code anpassen, schaffs aber nicht. Kann mir wer ein bischen helfen? Bitte an meinem Code, tipps geben oder so was damit ich das hinkriege und verstehe.

Code:
import java.awt.Color;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Board extends JFrame {
	JPanel panel = null;

	boolean sw = false;

	int x = 50;

	int y = 0;

	int queens = 8;

	boolean[][] felder = new boolean[8][8];

	public Board() {
		setTitle("Queen");
		setSize(500, 500);
		setLayout(null);

		for (int row = 0; row < 8; row++) {
			for (int column = 0; column < 8; column++) {
				felder[column][row] = validColumn(column, row)
						&& validRow(column, row) && validDiag(column, row);
			}
		}

		for (int row = 0; row < 8; row++) {
			for (int column = 0; column < 8; column++) {
				panel = new JPanel();
				sw = !sw;
				panel.setBackground(sw ? Color.WHITE : Color.BLACK);
				panel.setSize(50, 50);
				panel.setLocation(x, y);
				if (felder[column][row]) {
					drawQueen(column, row);
				}
				add(panel);
				y = y + 50;
			}
			sw = !sw;
			x = x + 50;
			y = 0;
			queens++;
		}
		this.setVisible(true);

	}

	public void drawQueen(int column, int row) {
		Queen queen = new Queen(new ImageIcon("queen.png").getImage(), row,
				column);

		panel.add(queen);
	}

	public boolean validColumn(int column, int row) {
		for (int queens = 0; queens < 8; queens++) {
			if (felder[queens][row]) {
				return false;
			}
		}
		return true;
	}

	public boolean validRow(int column, int row) {
		for (int queens = 0; queens < 8; queens++) {
			if (felder[column][queens]) {
				return false;
			}
		}
		return true;
	}

	public boolean validDiag(int column, int row) {

		for (int queens = 0; queens < 8; queens++) {
			if (row == column) {
					System.out.println("Row: " + row + "Column: " + column
							+ "Queens: " + queens);
					return false;
			}
		}
		return true;
	}

	public static void main(String[] args) {
		new Board();
	}
}

Danke
 

matdacat

Erfahrenes Mitglied
Ich mag mich ja täuschen, aber so aufn ersten Blick sieht mir dein Ansatz (einfach linear über das Feld iterieren und zu checken) zu trivial aus. Keine Rekursion, kein Backtracking?

Diese Lösung in Python sieht durchaus portierbar aus ;-)
 
Zuletzt bearbeitet:

Franz Degenhardt

Erfahrenes Mitglied
Jo, das ist zu trivial.
Test mal folgende Implementierung von validDiag mit deinem Code
Code:
	public boolean validDiag(int c, int r) {
		boolean result = true;
		int i=0;
		while(c + i < queens && r + i < queens){
			if(felder[c+i][r+i]){
				result = false;
			}
			i++;
		}
		i=0;
		while(c + i < queens && r - i >= 0){
			if(felder[c+i][r-i]){
				result = false;
			}
			i++;
		}
		i=0;
		while(c - i >= 0 && r - i >= 0){
			if(felder[c-i][r-i]){
				result = false;
			}
			i++;
		}
		i=0;
		while(c - i >= 0 && r + i < queens){
			if(felder[c-i][r+i]){
				result = false;
			}
			i++;
		}
		System.out.println("Diacheck: " + c + ":" + r + " result:" + result);
		return result;
	}
Ist nicht highsophisticated, man sieht aber das Problem. Nach 5 Damen ist Schluss.
http://www.tutorials.de/forum/attachment.php?attachmentid=45546&stc=1&d=1234370197
 

Anhänge

  • 5von8Damen.GIF
    5von8Damen.GIF
    13,7 KB · Aufrufe: 36