Sudoku Rätsel
lima-city → Forum → Programmiersprachen → Delphi & Pascal
code
entfernen
erlaubte transformationen
feld
jeweilige operation
kasten
leere felder
nachteil
point
programm
reihe
schleife
sender
spalte
spalten
string
tauschen
vorgehen
zahl
ziffer
-
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;
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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:
Null sind leere Felder.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
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:
Vertauschen von Dreierblöcken:1 <-> 2 4 <-> 5 7 <-> 8 1 <-> 3 4 <-> 6 7 <-> 9 2 <-> 3 5 <-> 6 8 <-> 9
D.h. es gibt 24 erlaubte Transformationen (gut man kann auch noch Ziffern tauschen, aber das wäre redundant).{1,2,3} <-> {4,5,6} {1,2,3} <-> {7,8,9} {4,5,6} <-> {7,8,9}
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 -
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. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage