How to resolve the algorithm Sudoku step by step in the Delphi programming language
Published on 12 May 2024 09:40 PM
How to resolve the algorithm Sudoku step by step in the Delphi programming language
Table of Contents
Problem Statement
Solve a partially filled-in normal 9x9 Sudoku grid and display the result in a human-readable format.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Sudoku step by step in the Delphi programming language
Source code in the delphi programming language
type
TIntArray = array of Integer;
{ TSudokuSolver }
TSudokuSolver = class
private
FGrid: TIntArray;
function CheckValidity(val: Integer; x: Integer; y: Integer): Boolean;
function ToString: string; reintroduce;
function PlaceNumber(pos: Integer): Boolean;
public
constructor Create(s: string);
procedure Solve;
end;
implementation
uses
Dialogs;
{ TSudokuSolver }
function TSudokuSolver.CheckValidity(val: Integer; x: Integer; y: Integer
): Boolean;
var
i: Integer;
j: Integer;
StartX: Integer;
StartY: Integer;
begin
for i := 0 to 8 do
begin
if (FGrid[y * 9 + i] = val) or
(FGrid[i * 9 + x] = val) then
begin
Result := False;
Exit;
end;
end;
StartX := (x div 3) * 3;
StartY := (y div 3) * 3;
for i := StartY to Pred(StartY + 3) do
begin
for j := StartX to Pred(StartX + 3) do
begin
if FGrid[i * 9 + j] = val then
begin
Result := False;
Exit;
end;
end;
end;
Result := True;
end;
function TSudokuSolver.ToString: string;
var
sb: string;
i: Integer;
j: Integer;
c: char;
begin
sb := '';
for i := 0 to 8 do
begin
for j := 0 to 8 do
begin
c := (IntToStr(FGrid[i * 9 + j]) + '0')[1];
sb := sb + c + ' ';
if (j = 2) or (j = 5) then sb := sb + '| ';
end;
sb := sb + #13#10;
if (i = 2) or (i = 5) then
sb := sb + '-----+-----+-----' + #13#10;
end;
Result := sb;
end;
function TSudokuSolver.PlaceNumber(pos: Integer): Boolean;
var
n: Integer;
begin
Result := False;
if Pos = 81 then
begin
Result := True;
Exit;
end;
if FGrid[pos] > 0 then
begin
Result := PlaceNumber(Succ(pos));
Exit;
end;
for n := 1 to 9 do
begin
if CheckValidity(n, pos mod 9, pos div 9) then
begin
FGrid[pos] := n;
Result := PlaceNumber(Succ(pos));
if not Result then
FGrid[pos] := 0;
end;
end;
end;
constructor TSudokuSolver.Create(s: string);
var
lcv: Cardinal;
begin
SetLength(FGrid, 81);
for lcv := 0 to Pred(Length(s)) do
FGrid[lcv] := StrToInt(s[Succ(lcv)]);
end;
procedure TSudokuSolver.Solve;
begin
if not PlaceNumber(0) then
ShowMessage('Unsolvable')
else
ShowMessage('Solved!');
end;
end;
var
SudokuSolver: TSudokuSolver;
begin
SudokuSolver := TSudokuSolver.Create('850002400' +
'720000009' +
'004000000' +
'000107002' +
'305000900' +
'040000000' +
'000080070' +
'017000000' +
'000036040');
try
SudokuSolver.Solve;
finally
FreeAndNil(SudokuSolver);
end;
end;
You may also check:How to resolve the algorithm Casting out nines step by step in the Visual Basic .NET programming language
You may also check:How to resolve the algorithm Exponentiation order step by step in the Lua programming language
You may also check:How to resolve the algorithm Percolation/Mean cluster density step by step in the J programming language
You may also check:How to resolve the algorithm Roman numerals/Decode step by step in the Euphoria programming language
You may also check:How to resolve the algorithm Vector step by step in the jq programming language