tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
278
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Malaxo Malaxo ist offline Mitglied Platin
    Registriert seit
    Jan 2004
    Beiträge
    529
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    
    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
     
    be real
    don't deal

  2. #2
    Avatar von matdacat
    matdacat matdacat ist offline Mitglied Platin
    Registriert seit
    Aug 2004
    Beiträge
    672
    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
    Geändert von matdacat (11.02.09 um 16:45 Uhr)
     

  3. #3
    Avatar von Franz Degenhardt
    Franz Degenhardt Franz Degenhardt ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Ort
    Köln
    Beiträge
    378
    Jo, das ist zu trivial.
    Test mal folgende Implementierung von validDiag mit deinem Code
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
        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/attach...1&d=1234370197
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken 8Damen Problem-5von8damen.gif  
     
    Denken gefärdet die Gewohnheit

  4. #4
    Malaxo Malaxo ist offline Mitglied Platin
    Registriert seit
    Jan 2004
    Beiträge
    529
    Hab den Ansatz verstanden. Danke für die Hilfe, werde mich nochmal dahinter machen.

    Gruss
     
    be real
    don't deal

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 11.01.11, 21:40
  2. Antworten: 4
    Letzter Beitrag: 22.03.06, 20:50
  3. Antworten: 0
    Letzter Beitrag: 06.10.04, 14:03
  4. PROBLEM! Pinnacle 2 GB Begrenzung Windows 2000 DC 50 PROBLEM!
    Von hennym im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 6
    Letzter Beitrag: 17.09.03, 22:09
  5. Antworten: 6
    Letzter Beitrag: 13.06.02, 12:29