N-Damen Problem



  • Kann mir jemand sagen, wie ich, ohne rekursive Funktionen zu verwenden, die Lösungsmoglichkeiten für das N-Damen Problem ermitteln kann, wobei ich die Anzahl der Damen (n) eingeben kann.
    Das Programm ist keine Konsolenanwendung, wie man am Skript unten erkennen kann. Er ermittelt mir zwar eine Lösung aber nicht die restlichen(glaub ich).
    Wäre über Feedback sehr froh.

    mfg
    Józek

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    int Damen[14]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
    int n, d1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     ListBox1->Clear();
     for(int reset=0; reset<14; reset++)
     {Damen[reset]=-1;}
     n = StrToInt(Edit1->Text);
     if(n==2 || n==3) ListBox1->Items->Append("Keine Lösung!");
     else
     {
      for(int i=0; i<n; )
      {
       Damen[i]=1; //jede Dame, ab Dame[1], wird zu Anfang aufs erste Feld gesetzt
       anfang: //Rückkehrpunkt, wenn ein Schritt zurück gegangen wird
       if(i>0)
       {
        ueberpruefen: //Rückkehrpunkt zum überprüfen
        d1=Damen[i]; //aktuellen Damenwert speichern
    
        for(int l=1; l<=i; l++) // Diagonalen prüefen
        {if(Damen[i]==Damen[i-l]+l || Damen[i]==Damen[i-l]-l) Damen[i]++;}
    
        for(int j=0;j<i;j++) // Spalte prüfen
        {if(Damen[i]==Damen[j]) Damen[i]++;}
    
        if(d1!=Damen[i]) goto ueberpruefen; //wenn er Änderungen an Damen[i]
                                            //feststellt, nochmal auf Spalten
                                            //und Diagonalen prüfen
        if(Damen[i]>n) {i--; Damen[i]++; goto anfang;} //Wenn die Damen die Felder
                                                       //übertreten, muss ein Fehler
                                                       //passiert sein -> Schritt zurück
        else i++; //wenn kein Fehler, probiere die nächste Dame zu setzen
       }
       else i++; //wenn Erste Dame gesetzt wurde, mit der nächsten weitermachen
      }
      for(int ausgabe=0; ausgabe<n; ausgabe++)
       ListBox1->Items->Append(Damen[ausgabe]);
     }
    }
    //---------------------------------------------------------------------------
    


  • Ähm, vielleicht bin ich etwas langsam, aber... was in aller Welt ist das n-Damen-Problem?

    Klingt sogar ein klein wenig nach Hausaufgaben, igitt 😉



  • Ich hab' ein uraltes pascal- Programm dafuer. Falls Du Pascl lesen und ueberseten kannst, kann ich das Teil mal reintun.



  • Schau mal hier hilft Dir das weiter ?

    http://www.arstechnica.de/computer/msoffice/vba/vba0030.html

    P.S. Ich habe es nicht getestet ob es funzt.
    P.P.S Dieses Programm pos. anscheinend nur 8 Damen (mehr get auch nicht auf einem 8X8 Schachbrett.) Wenn deine n-Damen 9 überschreitet, dann brauchst Du wohl ein größeres Schachbrett.



  • Also habe es dann doch mal getestet und du kannst die größe des Brettes sogar einstellen



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke, für die schnelle Unterstützung.
    Dis N-Damen-Problem ist tatsächlich ne Hausaufgabe und mein Skript berechnet sogar EINE Lösung, aber in dem Stil wie ich es programiert habe, hatte ich nicht mehr die Möglichkeit, oder ich habs übersehen, ALLE Lösungen abzufragen, obwohl ich wohl schon so durchgängig um die 6-7 Stunden daran gesessen hatte und sogar einen eeeeeeewig langen Trockentest für ein 6x6 Brett mit 6 Damen aufgeschrieben hatte. Letztendlich völlig entnervt und verzweifelt schrieb ich hier ins Forum und ta-ta-ta-taaaaa schon sind hier lauter Hilfestellungen.
    Einges davon hilft mir bestimmt weiter. Also nochmals vielen Dank an alle Hilfeleistenden oder die, die es versucht haben.
    thx und mfg
    Józek


Anmelden zum Antworten