Daß du dem Algo sozusagen verbietest, vorhandene Werte zu überschreiben, macht ihn unnötig langsam. Entspricht ja auch nicht dem Spielverlauf, man kann Werte ja auch wieder ausradieren und korrigieren. Ich hab’s bei mir so drinne (FRows, FCols, FBoxes: array of TIntegerList):
Delphi-Quellcode:
function TSudoku.CanSetValue(Index, Value: integer): boolean;
var
Row, Col, I: integer;
begin
Row := IndexToRowCol(Index).X;
Col := IndexToRowCol(Index).Y;
I := RowColToBoxRowCol(Row, Col).X;
Result := (FRows[Row].IndexOf(Value) < 0)
and (FCols[Col].IndexOf(Value) < 0)
and (FBoxes[I].IndexOf(Value) < 0);
end;
Ich finde es auch einfacher, die Schleifen von K:= 0..to 80 laufen zu lassen als von für i:= 0..8, j:= 0..8.
Delphi-Quellcode:
Function TSudoku.IndexToRowCol(Index: integer): TPoint;
begin
Result.X := Index div 9;
Result.Y := Index - Result.X * 9;
end;
function TSudoku.RowColToBoxRowCol(Row, Col: integer): TPoint;
begin
Result.X := Row div 3 mod 3 * 3
+ Col div 3 mod 3;
Result.Y := Row mod 3 * 3 + Col mod 3;
end;
Delphi-Quellcode:
FBoxes:
0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2
0.3 0.4 0.5 1.3 1.4 1.5 2.3 2.4 2.5
0.6 0.7 0.8 1.6 1.7 1.8 2.6 2.7 2.8
3.0 3.1 3.2 4.0 4.1 4.2 5.0 5.1 5.2
3.3 3.4 3.5 4.3 4.4 4.5 5.3 5.4 5.5
3.6 3.7 3.8 4.6 4.7 4.8 5.6 5.7 5.8
6.0 6.1 6.2 7.0 7.1 7.2 8.0 8.1 8.2
6.3 6.4 6.5 7.3 7.4 7.5 8.3 8.4 8.5
6.6 6.7 6.8 7.6 7.7 7.8 8.6 8.7 8.8
Ausgehend davon kann man zufällige Werte für den Index und für die Zahl bestimmen und das ganze solange durchführen bis "SudokuFond" (0,1 sec).