From 2b77fd9f3e8e99907734cec2d404ad256ecee1f5 Mon Sep 17 00:00:00 2001 From: lazarus-bart Date: Sun, 5 Jan 2020 11:18:48 +0000 Subject: [PATCH] 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 --- applications/sudoku/sudokutype.pas | 63 +++++++++++++++++------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/applications/sudoku/sudokutype.pas b/applications/sudoku/sudokutype.pas index b7f99ab18..f500339da 100644 --- a/applications/sudoku/sudokutype.pas +++ b/applications/sudoku/sudokutype.pas @@ -44,14 +44,14 @@ type function GiveSolution(var Values: TValues; out Steps: Integer): Boolean; private Grid : Array[1..9, 1..9] of TSquare; - procedure CalculateValues; + procedure CalculateValues(out IsSolved: Boolean); procedure CheckRow(c, r: Integer); procedure CheckCol(c, r: Integer); procedure CheckBlock(c, r: Integer); procedure CheckDigits(d: Integer); procedure Fill(Values: TValues); function Solve(out Steps: Integer): Boolean; - function Solved: Boolean; + //function Solved: Boolean; end; implementation @@ -116,8 +116,7 @@ begin end; end; for c := 1 to 9 do CheckDigits(c); - CalculateValues; - Result := Solved; + CalculateValues(Result); until Result or (Steps > 50); end; @@ -134,20 +133,30 @@ begin end; end; -procedure TSudoku.CalculateValues; +procedure TSudoku.CalculateValues(out IsSolved: Boolean); var c, r: Integer; - Value: Integer; + Value, Count: Integer; begin - for c := 1 to 9 do begin - for r := 1 to 9 do begin - if Grid[c, r].Locked then Continue; - if CountSetMembers(Grid[c, r].DigitsPossible, Value) = 1 then begin - Grid[c, r].Value := Value; - Grid[c, r].Locked := True; + Count := 0; + for c := 1 to 9 do + begin + for r := 1 to 9 do + begin + 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; + IsSolved := Count = 9 * 9; end; procedure TSudoku.CheckCol(c, r: Integer); @@ -223,21 +232,21 @@ begin end; end; -function TSudoku.Solved: Boolean; -var - c, r: Integer; -begin - result := True; - for c := 1 to 9 do begin - for r := 1 to 9 do begin - if not Grid[c, r].Locked then begin - Result := False; - Break; - end; - end; - if not result then Break; - end; -end; +//function TSudoku.Solved: Boolean; +//var +// c, r: Integer; +//begin +// result := True; +// for c := 1 to 9 do begin +// for r := 1 to 9 do begin +// if not Grid[c, r].Locked then begin +// Result := False; +// Break; +// end; +// end; +// if not result then Break; +// end; +//end; end.