Sudoku: refactor unit SudokuType: calculated wethere sudoku is solved in one step.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7237 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
lazarus-bart
2020-01-05 11:18:48 +00:00
parent 9c5bbcad39
commit 2b77fd9f3e

View File

@ -44,14 +44,14 @@ type
function GiveSolution(var Values: TValues; out Steps: Integer): Boolean; function GiveSolution(var Values: TValues; out Steps: Integer): Boolean;
private private
Grid : Array[1..9, 1..9] of TSquare; Grid : Array[1..9, 1..9] of TSquare;
procedure CalculateValues; procedure CalculateValues(out IsSolved: Boolean);
procedure CheckRow(c, r: Integer); procedure CheckRow(c, r: Integer);
procedure CheckCol(c, r: Integer); procedure CheckCol(c, r: Integer);
procedure CheckBlock(c, r: Integer); procedure CheckBlock(c, r: Integer);
procedure CheckDigits(d: Integer); procedure CheckDigits(d: Integer);
procedure Fill(Values: TValues); procedure Fill(Values: TValues);
function Solve(out Steps: Integer): Boolean; function Solve(out Steps: Integer): Boolean;
function Solved: Boolean; //function Solved: Boolean;
end; end;
implementation implementation
@ -116,8 +116,7 @@ begin
end; end;
end; end;
for c := 1 to 9 do CheckDigits(c); for c := 1 to 9 do CheckDigits(c);
CalculateValues; CalculateValues(Result);
Result := Solved;
until Result or (Steps > 50); until Result or (Steps > 50);
end; end;
@ -134,20 +133,30 @@ begin
end; end;
end; end;
procedure TSudoku.CalculateValues; procedure TSudoku.CalculateValues(out IsSolved: Boolean);
var var
c, r: Integer; c, r: Integer;
Value: Integer; Value, Count: Integer;
begin begin
for c := 1 to 9 do begin Count := 0;
for r := 1 to 9 do begin for c := 1 to 9 do
if Grid[c, r].Locked then Continue; begin
if CountSetMembers(Grid[c, r].DigitsPossible, Value) = 1 then begin for r := 1 to 9 do
Grid[c, r].Value := Value; begin
Grid[c, r].Locked := True; if Grid[c, r].Locked then
Inc(Count)
else
begin
if CountSetMembers(Grid[c, r].DigitsPossible, Value) = 1 then
begin
Grid[c, r].Value := Value;
Grid[c, r].Locked := True;
Inc(Count);
end;
end; end;
end; end;
end; end;
IsSolved := Count = 9 * 9;
end; end;
procedure TSudoku.CheckCol(c, r: Integer); procedure TSudoku.CheckCol(c, r: Integer);
@ -223,21 +232,21 @@ begin
end; end;
end; end;
function TSudoku.Solved: Boolean; //function TSudoku.Solved: Boolean;
var //var
c, r: Integer; // c, r: Integer;
begin //begin
result := True; // result := True;
for c := 1 to 9 do begin // for c := 1 to 9 do begin
for r := 1 to 9 do begin // for r := 1 to 9 do begin
if not Grid[c, r].Locked then begin // if not Grid[c, r].Locked then begin
Result := False; // Result := False;
Break; // Break;
end; // end;
end; // end;
if not result then Break; // if not result then Break;
end; // end;
end; //end;
end. end.