n-Damen-Problem



  • Hallo Leute,

    habe folgendes Problem. Habe ein kleines Problem. Haben ein Teilprogramm bekommen und sollen die Stellen, die mit Kommentaren ergänzen. Im Hauptprogramm soll die Eingabe für n über scanf erfolgen. Über schnelle Hilfe wäre ich sehr dankbar!!

    #include <stdio.h>
    #include <stdlib.h>

    #define maxNoOfQueens (8) // hier die maximale Eingabe festlegen

    int x[maxNoOfQueens];

    void print () {
    int i,j;

    printf ("+----------------+\n"); // +----- ... ----+ ausgeben
    for (i=0; i<maxNoOfQueens; i++) {
    printf ("|");
    for (j=0; j<maxNoOfQueens; j++)
    if (j==x[i]) printf ("<>");
    else printf (" ");
    printf ("|\n");
    }
    printf ("+");
    for (i=0; i<maxNoOfQueens; i++) {
    printf ("--");
    }
    printf ("+----------------+\n\n"); // +----- ... ----+ ausgeben
    }

    int is_save (int ix, int iy) {
    int i;
    for (i=0; i<iy; i++) {
    if ((x[i]==ix) || (abs(x[i]-ix)==abs(i-iy))) {
    return 0;
    }
    }
    return 1;
    }

    void try (int n)
    {
    int i;
    if (n==8) print ();
    // Ausgeben

    else {
    for (i=0; i<8; i++) {
    if (is_save(i, n)) {
    x[n]=i; // Speichere mögliche Position der n-ten Dame
    try (n+1); // versuche n+1
    }
    }
    }
    }

    int main (int argc, char * argv[]) {
    // Version 1: n aus argv lesen
    printf("Geben Sie für die Anzahl der Damen einen ganzzahligen Wert zwischen 1 und 8 ein/n");
    scanf("%i", &n); // Version 2: n ueber scanf einlesen

    if (n>=8) print; ("Geben Sie bitte eine Zahl zwischen 1 und 8 an!/n"); // n ungueltig oder zu gross? dann Textausgabe und return

    // Ausgabe: Loesung des n-Damen-Problems (mit n als Eingabe)

    try (0);
    return 0;
    }



  • Ist kein C#, sondern C.



  • Erstens: Die meisten dieser Kommentare erklären den Code, der schon dort steht.

    Zweitens: Bitte verwende cpp-Tags anstelle der quote-Tags, dann formatiert das Forum den Quelltext übersichtlicher

    Drittens: Wo ist dein Problem? (außer daß du im falschen Board gelandet bist)



  • int main (int argc, char * argv[]) { 
    // Version 1: n aus argv lesen 
    printf("Geben Sie für die Anzahl der Damen einen ganzzahligen Wert zwischen 1 und 8 ein/n"); 
    scanf("%i", &n); // Version 2: n ueber scanf einlesen
    

    Der zeigt mir da noch einen Fehler an, bei der Zeile mit scanf. Danke trotzdem schonmal für die Tipps



  • Das liegt vermutlich daran, daß du die Variable "n" nicht definiert hast. (das einzige n in deinem oberen Code ist der Parameter der try()-Funktion)

    Es wäre halt ganz nützlich, wenn du die Fehlermeldungen des Compilers auch lesen würdest - normalerweise teilt er dir etwas mehr mit als nur "das geht nicht".



  • Wie kann dich das bei scanf festlegen dass die Variable n von der funktion try da verwendet wird? Danke schonmal!



  • Gar nicht - Funktionsparameter sind nur in der Funktion bekannt, in der sie definiert sind. Du kannst aber in der main() eine eigene Variable anlegen und füllen, die du dann als Parameter an try() und print() übergeben kannst.



  • Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum C (C89 und C99) verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Bei Deiner Funktion print () fehlt übrigens das abschließende '}'

    Ansonsten solltest du in der main () ein int n definieren, alternativ auch an der Stelle, wo das globale int x[] steht.

    #include <stdio.h>
    #include <stdlib.h>
    
    #define maxNoOfQueens (8) // hier die maximale Eingabe festlegen
    
    int x[maxNoOfQueens];
    
    void print () 
    {
      int i,j;
    
      printf ("+----------------+\n"); // +----- ... ----+ ausgeben
      for (i=0; i<maxNoOfQueens; i++) 
      {
        printf ("|");
        for (j=0; j<maxNoOfQueens; j++)
        {
          if (j==x[i])
            printf ("<>");
          else 
            printf (" ");
          printf ("|\n");
        }
        printf ("+");
        for (i=0; i<maxNoOfQueens; i++) 
        {
          printf ("--");
        }
        printf ("+----------------+\n\n"); // +----- ... ----+ ausgeben
      }
    }
    int is_save (int ix, int iy) 
    {
      int i;
      for (i=0; i<iy; i++) 
      {
        if ((x[i]==ix) || (abs(x[i]-ix)==abs(i-iy))) 
          return 0;
      }
      return 1;
    }
    
    void try (int n)
    {
      int i;
      if (n==8) 
        print ();
        // Ausgeben
      else 
      {
        for (i=0; i<8; i++) 
        {
          if (is_save(i, n)) 
          {
            x[n]=i; // Speichere mögliche Position der n-ten Dame
            try (n+1); // versuche n+1
          }
        }
      }
    }
    
    int main (int argc, char * argv[]) 
    {
      // Version 1: n aus argv lesen
      printf("Geben Sie für die Anzahl der Damen einen ganzzahligen Wert zwischen 1 und 8 ein/n");
      scanf("%i", &n); // Version 2: n ueber scanf einlesen
    
      if (n>=8) print; ("Geben Sie bitte eine Zahl zwischen 1 und 8 an!/n"); // n ungueltig oder zu gross? dann Textausgabe und return
    
      // Ausgabe: Loesung des n-Damen-Problems (mit n als Eingabe)
    
      try (0);
      return 0;
    }
    


  • PrettyPrinter schrieb:

    Bei Deiner Funktion print () fehlt übrigens das abschließende '}'

    Und bei deiner Variante funktioniert print gar nicht, '/n' statt '\n' habe ich auch lange schon nicht mehr gesehen.



  • Scheint doch schwierig zu sein, eine offensichtlich fehlende int Variable zu definieren, auch scheint der Algorithmus selbst wohl noch überarbeitungswürdig.

    http://ideone.com/hcoyX



  • Ich habe wohlgemerkt nicht jedes Zeichen überprüft - ehrlich gesagt nicht mal ansatzweise den Code überflogen. Ich war nur so frei und habe das Einrücken übernommen.

    Aber danke für Deine offenen Augen.


Anmelden zum Antworten