Acht Damen Problem in Java funktioniert nicht

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Acht Damen Problem in Java funktioniert nicht

    Hi @ all

    Hab folgenden Code von meiner AlgoDat Dozentin bekommen und aus ihrem Skript raus kopiert. Nun funktioniert das Ding aber net -.- ...
    Leider bin ich nicht der gewandteste im Programmieren :P
    Anfänger sozusagen ... ^^
    Jetzt hoffe ich einer von euch kann da nen Blick drauf werfen und findet evtl. das Problem!
    Zur Dozentin kann ich nicht mehr gehen, weil ich die bis übermorgen nicht mehr sehe und da Schreib ich Prüfung :P

    Vielen Dank und viele Grüße
    Liptux

    Quellcode

    1. public class AchtDamen {
    2. private int n; // Dimension des Problems
    3. // bereits gesetzte Damen
    4. private int[] dameInReihe; // muss mit -1 initialisiert werden
    5. // speichert bedrohte Spalten und Diagonalen
    6. // muss mit false (=frei) initialisiert werden
    7. private boolean[] spalte;
    8. private boolean[] diagRechts;
    9. private boolean[] diagLinks;
    10. AchtDamen(int n) {
    11. this.n = n;
    12. dameInReihe = new int[n];
    13. spalte = new boolean[n];
    14. for (int i = 0; i < n; i++) {
    15. dameInReihe[i] = -1;
    16. spalte[i] = false;
    17. }
    18. diagRechts = new boolean[2 * n - 1];
    19. diagLinks = new boolean[2 * n - 1];
    20. for (int i = 0; i < 2 * n - 1; i++) {
    21. diagRechts[i] = false;
    22. diagLinks[i] = false;
    23. }
    24. }
    25. boolean versuchen(int x) { // x: aktuelle Dame[0,7]
    26. if (x == n) {
    27. // Abbruchbedingung der Rekursion:
    28. // alle n Damen [0, n-1] sind platziert: fertig!
    29. return true;
    30. } else {
    31. // Laufschleife ueber alle Spalten
    32. for (int y = 0; y < n; y++) {
    33. // Berechne Diagonale
    34. int links = (x + y);
    35. int rechts = (n - 1 - x + y);
    36. // wenn PLatz nicht bedroht:
    37. if (!spalte[y] && !diagRechts[rechts] && !diagLinks[links]) {
    38. // Dame setzten und bedrohte Spalte
    39. // und Diagonale markieren:
    40. dameInReihe[x] = y;
    41. spalte[y] = true;
    42. diagLinks[links] = true;
    43. diagLinks[rechts] = true;
    44. // nur fuer Anschauungszwecke:
    45. printSpielfeld(x);
    46. // nächste Dame:
    47. boolean erfolg = versuchen(x + 1);
    48. if (erfolg) {
    49. // Damen erfolgreich gesetzt, abbrechen:
    50. return true;
    51. } else {
    52. // naechste Position in for-Schleife, deshalb
    53. // Spalten und Diagonalen zurücksetzen:
    54. dameInReihe[x] = -1;
    55. spalte[y] = false;
    56. diagRechts[rechts] = false;
    57. diagLinks[links] = false;
    58. }
    59. }
    60. }
    61. // nicht machbar, Rekursion mit false beenden.
    62. return false;
    63. }
    64. }
    65. // eine Ausgabefunktion nur für Testzwecke
    66. void printSpielfeld(int x) {
    67. for (int i = 0; i < n; i++) {
    68. for (int j = 0; j < dameInReihe[i]; j++) {
    69. System.out.print("| ");
    70. }
    71. if (dameInReihe[i] != -1) {
    72. System.out.print("| x ");
    73. }
    74. for (int j = dameInReihe[i] + 1; j < n; j++) {
    75. System.out.print("| ");
    76. }
    77. System.out.println("|");
    78. for (int k = 0; k < n; k++) {
    79. System.out.print("----");
    80. }
    81. System.out.println("-");
    82. }
    83. // Zeitverzoegerung fuer langsame Ausgabe:
    84. try {
    85. Thread.sleep(1000);
    86. } catch (InterruptedException e) {
    87. }
    88. System.out.println("\n");
    89. }
    90. public static void main(String[] args) {
    91. AchtDamen meinVersuch = new AchtDamen(4);
    92. meinVersuch.versuchen(0);
    93. }
    94. }
    Alles anzeigen
  • Mir ist gerade aufgefallen, dass ich gar nicht erwähnt habe, was nicht funktioniert ^^....

    Also ne Fehlermeldung kommt nicht, sondern die Ausgabe auf der Konsole klappt net.
    Also der setzt die x (für die Damen) falsch. Jetzt weiß ich nicht ob das setzen mit den sysouts nicht hin haut oder ob der Code an sich falsch ist ;D