![]() |
Sudoku Lösen und Code Verständnisproblem
Hallo, da bin ich schon wieder :D
Nun geht es darum, ein Sudoku zu lösen. Genauer gesagt habe ch ein Sudoku mit einigen Lücken und möchte eine bestimmte Zahl in eine dieser Lücken platzieren, wo die Spielregeln dies eben zulassen. Ich habe hier meines Wissens alle Sudoku-OpenSource Codes ect. durchgesehen. Am ansprechensden fand ich diesen ![]() Leider scheitert es schon am Anfang, dem "eingeben" des Sudokus. Ich habe mein Sudoku in einem StringGrid gespeichert und möchte es nun in das Array der Unit umwandeln. Der Code der fremden Unit:
Delphi-Quellcode:
Mein Code zum Eintragen:
...
type use= set of 1..81; TSudoku=Class(TObject) private sudoku: Array of Array[1..81] of Integer; impossible:Array of Array[1..9,1..9,1..9] of Boolean; owner: Array of Array[1..9,1..9,1..9] of Integer; quadrant: Array of Array[1..3,1..3,1..9] of Boolean; count,num:integer; ... procedure TSudoku.SetVal(num,index,val:integer); begin sudoku[num,index]:=val; end;; ...
Delphi-Quellcode:
In der Beschreibung steht noch:
procedure TfrmMain.btnSudokuAnClick(Sender: TObject);
var m, n, i: integer; begin Sudoku.Create; i := 1; for m := 0 to 8 do begin for n := 0 to 8 do begin Sudoku.SetVal(0,i,strtoint(sgSudoku.Cells[m,n])); inc(i); end; end; end; Zitat:
MFG MaToBe PS: Falls jemand einen Codeausschnitt hat, der genau das Leistet was ich oben beschieben habe, wär ich nicht abgeneigt, mir diesen mal anzusehn :thumb: |
Re: Sudoku Lösen und Code Verständnisproblem
Vielleicht hilft dir das
![]() |
Re: Sudoku Lösen und Code Verständnisproblem
Delphi-Quellcode:
Ansonsten dürfte die Fehlerbeschreibung etwas genauer sein ;)
Sudoku := TSudoku.Create;
Grüsse, Dirk |
Re: Sudoku Lösen und Code Verständnisproblem
Zitat:
Zitat:
jetzt scheint es zu funktionieren, auch wenn ich natürlich keine visuelle Bestätigung habe.
Delphi-Quellcode:
Mit diesem Code werden fü jedes Feld, so wie ich das Verstanden habe, die möglichen Zahlen gesetzt. Allerdings werde ich daraus nicht ganz schlau. Vielleicht kann mir das einer grob erklären... Ansatz usw.
...
type use= set of 1..81; TSudoku=Class(TObject) private sudoku: Array of Array[1..81] of Integer; impossible:Array of Array[1..9,1..9,1..9] of Boolean; owner: Array of Array[1..9,1..9,1..9] of Integer; quadrant: Array of Array[1..3,1..3,1..9] of Boolean; count,num:integer; fehler:boolean; ErrVal,ErrNum:integer; inuse: set of 1..81; ... procedure TSudoku.SetPos(num,index:integer); //Möglichkeiten setzen var x,y,c1,c2,Val,LineX,LineY,QuadX,QuadY:integer; begin LineX:=GetLineX(index); LineY:=GetLineY(index); QuadX:=GetQuadX(index); QuadY:=GetQuadY(index); Val:=Sudoku[num,index]; //Zeilen Möglichkeiten setzen; for c1:=1 to 9 do begin if owner[num,LineX,c1,val]=0 then owner[num,LineX,c1,val]:=index; impossible[num,LineX,c1,val]:=true; if owner[num,c1,LineY,val]=0 then owner[num,c1,LineY,val]:=index; impossible[num,c1,LineY,val]:=true; if owner[num,Linex,Liney,c1]=0 then begin owner[num,Linex,Liney,c1]:=index; impossible[num,Linex,Liney,c1]:=true; end; end; for c1:= 1 to 3 do begin x:=(Quadx-1)*3+c1; for c2:=1 to 3 do begin y:=(Quady-1)*3+c2; if owner[num,x,y,val]=0 then owner[num,x,y,val]:=index; impossible[num,x,y,val]:=true; end; end; Quadrant[num,QuadX,QuadY,val]:=true; end; |
Re: Sudoku Lösen und Code Verständnisproblem
Zitat:
Trägst Du in ein Feld eine Zahl ein und rufst SetPos(Feld) auf, dann werden hier alle Feldern der betreffenden Zeile, Spalte und des betreffenden Quadrats markiert als "hier darf die Zahl nicht mehr hin". Jetzt könnte es ja sein das man bei diesem "Verbieten" an ein Feld kommt wo die Zahl sowieso schon nicht mehr hin darf, bedingt durch ein ganz anderes Feld. Wenn ich dann im Lösungsalgorithmus des Feld wieder zurücknehmen möchte weil es falsch war, dann darf ich die Zahl nur an den Stellen "freigeben" an denen sie auch durch dieses Feld verboten wurde. Diese Unterscheidung passiert in "Owner", da wird eingetragen welches Feld dafür verantwortlich ist das diese spezielle Zahl an der Stelle keinen Platz findet. Grüsse, Dirk PS: ob diese Implementierung jetzt besonders gut strukturiert ist weis ich nicht, mir fehlt die Objektorientierung in der Datenstruktur (ein Feld wäre für mich ein individuelles Objekt das in Zeile/Spalte/Quadrat referenziert wird) und es gibt für meinen Geschmack zu viele goto´s.. und selbermachen ist viel lehrreicher ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz