kostenloser Webspace werbefrei: lima-city


Sudoku Rätsel

lima-cityForumProgrammiersprachenDelphi & Pascal

  1. Autor dieses Themas

    gauss-design

    Kostenloser Webspace von gauss-design

    gauss-design hat kostenlosen Webspace.

    Ich habe mich mal an ein Sodoku- Rätsel gewagt.
    Mein Erfolg hält sich jedoch in Grenzen. Ich habe es geschafft, dass er in den 9x9 Zellen alle 3 Regeln (keine gleichen in Kasten, Reihe, Spalte) auslesen kann.
    Jedoch generiert er sich falsch, weswegen leere Kästchen entstehen.

    Zurzeit mache ich das so, dass er jede Reihe durchgeht, eine Zufallszahl aus 9 wählt, und prüft ob diese in der Reihe, Spalte bzw. Kasten schon vorkommt.
    Kann mir jemand eventuell einen kleinen Denkanstoß geben, egal welche Programmiersprache, mir geht es nur ums Prinzip, wie ich vorgehen muss, bis jetzt sieht Quelltext(Delphi) so aus:

    procedure TForm1.Button1Click(Sender: TObject);
    var i,j,k,a,r:integer;
    z: string;
    gefunden: boolean;
    begin
      randomize;
      for i:= 0 to 8 do
      begin
        for j:= 0 to 8 do
        begin
          z:= zahlen;
          gefunden:= false;
          while (length(z) > 0) and (gefunden = false) do
          begin
            r:= random(length(z))+1;
            a:= StrToInt(z[r]);
            Delete(z,r,1);
            if (check_horizontal(Point(j,i),a)) and
               (check_vertikal(Point(j,i),a)) and
               (check_kasten(Point(j,i),a)) then
            begin
              Sudoku.Cells[j,i]:= IntToStr(a);
              gefunden:= true;
            end;
          end;
        end;
      end;
    end;
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo gauss-design,

    das Du kein vollständig ausgefülltes Sudoku bekommst liegt daran, dass nicht jedes Rätsel lösbar ist.
    Du kannst ja mal vesuchen die Felder, die Dein Programm leer läßt selber zu füllen.
    Bei mir wurde z.B. folgendes erstelle:
    7       6       5       2       4       3       9       1       8
    9       3       4       7       8       6       5       2       0
    2       1       8       5       9       0       3       7       6
    8       5       7       6       3       1       4       9       2
    3       9       2       8       5       4       6       0       7
    4       0       1       9       7       2       8       3       5
    1       4       3       0       6       9       7       5       0
    5       2       6       3       1       8       0       4       9
    0       7       9       4       2       5       1       6       3
    Null sind leere Felder.

    Edit:
    Der einfachste Weg, um neue Sudokus zu generieren, ist, wenn man von einem bereits gelöstem Rätsel ausgeht.
    Wenn man ein gelöstes Rätsel hat, dann kann man folgende Operationen ausführen ohne dass das Rätsel unlösbar wird:
    Vertauschen von Zeilen / Spalten:
    1 <-> 2    4 <-> 5    7 <-> 8
    1 <-> 3    4 <-> 6    7 <-> 9
    2 <-> 3    5 <-> 6    8 <-> 9
    Vertauschen von Dreierblöcken:
    {1,2,3} <-> {4,5,6}
    {1,2,3} <-> {7,8,9}
    {4,5,6} <-> {7,8,9}
    D.h. es gibt 24 erlaubte Transformationen (gut man kann auch noch Ziffern tauschen, aber das wäre redundant).
    Jetzt kannst Du den Zufallsgenerator mehrfach nach einer Zahl zwischen eins und 24 fragen und im Anschluss daran die jeweilige Operation ausführen. Zum Schluss kannst Du dann zufällig Zahlen aus dem Rätsel entfernen.


    Beitrag zuletzt geändert: 14.12.2011 20:52:09 von darkpandemic
  4. Autor dieses Themas

    gauss-design

    Kostenloser Webspace von gauss-design

    gauss-design hat kostenlosen Webspace.

    Danke für den Hinweis, dass es nicht lösbare gibt. Hab jetzt eine Funktion geschrieben, die 9x eine 1 verteilt, 9x eine 2 und so weiter, sodass das ganze Feld gefüllt ist. Diesen Füllvorgang vollführt mein Programm mehrmals, sollte immer noch kein Ergebnis gefunden sein, so löscht er das Feld und schreibt ein neues, bis die Lösung gefunden wurde.

    Eine etwas billige Methode, wie ich finde, aber es generiert einwandfreie Sudokus nach einiger Zeit.

    procedure TForm1.Button1Click(Sender: TObject);
    var i,trys,j,r,x,y,k,l:integer;
        zy,zx:string;
    begin
    trys := 0;
    while (check_is_full()=false) and (trys< 24) do
     begin
      for i := 1 to 9 do  //Zahlen von 1 - 9
      begin
        for j := 0 to 8 do //Matrix
          begin
              zx:= '123';
              for k := 1 to 3 do
              begin
                r:= random(length(zx))+1;
                x:= StrToInt(zx[r]);
                case j of
                0,3,6: x:= x + -1;
                1,4,7: x:= x + 2;
                2,5,8: x:= x + 5;
                end;
                Delete(zx,r,1);
                zy:= '123';
                for l := 1 to 3 do
                begin
                  r:= random(length(zy))+1;
                  y:= StrToInt(zy[r]);
                  case j of
                  0,1,2: y:= y + -1;
                  3,4,5: y:= y + 2;
                  6,7,8: y:= y + 5;
                  end;
                  Delete(zy,r,1);
                    if check(Point(x,y),i) then Sudoku.Cells[x,y]:= IntToStr(i);
                end;
              end;
            end;
          end;
     Application.ProcessMessages;
     trys := trys + 1;
     Button2.Caption:= IntToStr(trys);
     end;
    if trys = 24 then
    begin
      clear();
      Button1.Click;
    end;
    end;


    Hier der Code der generiert. Ein nachteil hat das, dass er in einer Schleife hängen bleiben könnte, was jedoch noch nicht vorgekommen ist.
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!