none
Algorithmus für Sudokus RRS feed

  • Frage

  • Hallo,

     

    ich bin gerade dabei ein Sudoku zu programmieren.

    Bis auf die Sache, dass das Programm nicht in der Lage

    ist "lösbare Sudokus und auch mit genügend Zahlen zu erzeugen",

    (bei mir gehen bislang maximal 20). Ansonsten läuft aber schon alles

    (Habe es an einem vorgegebenen Sudoku getestet).

    Nun zu meiner Frage: Kennt vielleicht jemand einen Algorithmus, der

    zufällig lösbare Sudokus erzeugen kann? Dabei sollen die vorgegeben Zahlen

    erstmal manuell eingestellt werden können.

     

    Gruß Volker

    Montag, 5. Juli 2010 18:52

Antworten

  • Alles nur einzelne Ziffern? Keine zweistelligen?

    Etwa sowas?

        private void Form1_Load(object sender, EventArgs e)
        {
          string z = "1234567890";
    
          foreach (char c in z)
          {
            MessageBox.Show(c.ToString());
          }
        }

     Wenn der String aus der Textdatei Zeilenumbrüche hat, kannst Du dieses auch "filtern", schau Dir mal die Methode Split() von System.String an.

    Viele Grüße,

      Thorsten

    • Als Antwort markiert deppensido Dienstag, 6. Juli 2010 18:17
    Dienstag, 6. Juli 2010 15:00

Alle Antworten

  • Montag, 5. Juli 2010 21:53
  • Hallo,

     

    Erstmal danke für die Links! Jedoch müsste ich mein sudoku von 0 beginnen, wenn ich 

    deren algorithmus benutzen möchte. Deshalb hab ich mir überlegt mittels einer Textdatei

    fertige Sudokus vorzugeben, die ich zuvor nach folgendem format in die Textdatei eingegeben habe:

     

    xxxxxxxxx

    xxxxxxxxx

    xxxxxxxxx

    xxxxxxxxx

    xxxxxxxxx

    xxxxxxxxx

    xxxxxxxxx

    xxxxxxxxx

    xxxxxxxxx

     

    Dabei möchte ich jede Zahl nacheinander in ein Array übergeben, welches ich später mit meinen variablen versehe, die

    prüfen, ob das sudoku erfolgreich gelöst wurde.

     

    Nun meine Frage: Wie kann ich jede Zahl einzelnd, nacheinander einlesen lassen, sodass

    ich jede Zahl dem array zuordnen kann?

     

    Gruß Volker

    Dienstag, 6. Juli 2010 14:51
  • Alles nur einzelne Ziffern? Keine zweistelligen?

    Etwa sowas?

        private void Form1_Load(object sender, EventArgs e)
        {
          string z = "1234567890";
    
          foreach (char c in z)
          {
            MessageBox.Show(c.ToString());
          }
        }

     Wenn der String aus der Textdatei Zeilenumbrüche hat, kannst Du dieses auch "filtern", schau Dir mal die Methode Split() von System.String an.

    Viele Grüße,

      Thorsten

    • Als Antwort markiert deppensido Dienstag, 6. Juli 2010 18:17
    Dienstag, 6. Juli 2010 15:00
  • Hallo,

     

    ja nur einzelne Ziffern mein ich.

    Aber wie kann ich denn die Zeichen, die bei deinem

    Beispielcode in char c gespeichert werden in ein Array übergeben.

    Hier mal wie ich es versucht habe, er gibt aber nur leere zeichen aus.

     

       private void Sudoku_erstellen()

            {

                StreamReader sr = new StreamReader(cb_auswahl.Text);

     

                sudoku[0] = sr.ReadToEnd();

     

                foreach (char c in sudoku[0])

                {

                    for (int i = 0; i < sudoku.Length; i++)

                    {

                        sud[i] = c; //sud ist auch ein char Array

                    }

                }

                MessageBox.Show(sud[0].ToString());

                MessageBox.Show(sud[1].ToString());

                MessageBox.Show(sud[2].ToString());

                MessageBox.Show(sud[3].ToString());

                MessageBox.Show(sud[4].ToString());

            }

     

    Gruß Volker

    Dienstag, 6. Juli 2010 17:51
  • hallo,

     

    habs jetzt doch hinbekommen:

         private void Sudoku_erstellen()

            {

                StreamReader sr = new StreamReader(cb_auswahl.Text);

     

                sudoku[0] = sr.ReadToEnd();

                sudoku[0].CopyTo(0, sud, 0, 81);

     

                for (int i = 0; i < sud.Length; i++)

                    cb_auswahl.Items.Add(sud[i]);

            }

    Nun, hab ich was ich möchte. Aber troztdem danke!

    Gruß Volker

    Dienstag, 6. Juli 2010 18:17
  • Hallo, ich sehe, Du hast offensichtlich schon Deine Lösung gefunden, trotzdem hier:

      string[] sudoku = new string[7];
      public Form1()
      {
       InitializeComponent();
      }
    
      private void Form1_Load(object sender, EventArgs e)
      {
       StreamReader sr = new StreamReader(cb_auswahl.Text);
       sudoku[0] = sr.ReadToEnd();
       sr.Close();
    
       char[] sud = new char[sudoku[0].Length];
       int i = 0;
    
       foreach (Char c in sudoku[0])
       {
        sud[i] = c;
        i++;
       }
    
       MessageBox.Show(sud[0].ToString());
       MessageBox.Show(sud[1].ToString());
       MessageBox.Show(sud[2].ToString());
       MessageBox.Show(sud[3].ToString());
       MessageBox.Show(sud[4].ToString());
      }

    Vergiss nicht, den StreamReader zu schließen (sr.Close())

      Viele Grüße,

      Thorsten

    Dienstag, 6. Juli 2010 18:28
  • StreamReader sr = new StreamReader(cb_auswahl.Text);
    sudoku[0] = sr.ReadToEnd();

    oder oft genügt:
      File.ReadAllText(path)

    Dienstag, 6. Juli 2010 18:33