You've already forked lazarus-ccr
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:
@ -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.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user