Simba Code:
program SudokuSolver;
var
Puzzle: Array [0..8] of Array [0..8] of Integer;
function FindNextCellToFill(PuzzleGrid: Array [0..8] of Array [0..8] of Integer; Row, Column: Integer): Array [0..1] of Integer;
var
x, y: Integer;
begin
for x := Row to 8 do
for y := Column to 8 do
if PuzzleGrid[x][y] = 0 then
begin
Result := [x, y];
Exit;
end;
for x := 0 to 8 do
for y := 0 to 8 do
if PuzzleGrid[x][y] = 0 then
begin
Result := [x, y];
Exit;
end;
Result := [-1, -1];
end;
function IsValid(PuzzleGrid: Array [0..8] of Array [0..8] of Integer; Row, Column, Test: Integer): Boolean;
var
x, y: Integer;
begin
for y := 0 to 8 do
if Test = PuzzleGrid[Row][y] then
begin
Result := False;
Exit;
end;
for x := 0 to 8 do
if Test = PuzzleGrid[x][Column] then
begin
Result := False;
Exit;
end;
for x := 0 to 2 do
begin
for y := 0 to 2 do
begin
if PuzzleGrid[x + Row - (Row MOD 3)][y + Column - (Column MOD 3)] = Test then
begin
Result := False;
Exit;
end;
end;
end;
Result := True;
end;
function SolveSudoku(PuzzleGrid: Array [0..8] of Array [0..8] of Integer; Row, Column: Integer = 0): Boolean;
var
Test: Integer;
begin
Row := FindNextCellToFill(PuzzleGrid, Row, Column)[0];
Column := FindNextCellToFill(PuzzleGrid, Row, Column)[1];
if Row = -1 then
begin
Puzzle := PuzzleGrid;
Result := True;
Exit;
end;
for Test := 1 to 9 do
if IsValid(PuzzleGrid, Row, Column, Test) then
begin
PuzzleGrid[Row][Column] := Test;
if SolveSudoku(PuzzleGrid, Row, Column) then
begin
Result := True;
Exit;
end;
PuzzleGrid[Row][Column] := 0;
end;
Result := False;
end;
begin
ClearDebug;
{
Puzzle := [[3, 0, 6, 5, 0, 8, 4, 0, 0],
[5, 2, 0, 0, 0, 0, 0, 0, 0],
[0, 8, 7, 0, 0, 0, 0, 3, 1],
[0, 0, 3, 0, 1, 0, 0, 8, 0],
[9, 0, 0, 8, 6, 3, 0, 0, 5],
[0, 5, 0, 0, 9, 0, 6, 0, 0],
[1, 3, 0, 0, 0, 0, 2, 5, 0],
[0, 0, 0, 0, 0, 0, 0, 7, 4],
[0, 0, 5, 2, 0, 6, 3, 0, 0]];
}
Puzzle := [[5, 1, 7, 6, 0, 0, 0, 3, 4],
[2, 8, 9, 0, 0, 4, 0, 0, 0],
[3, 4, 6, 2, 0, 5, 0, 9, 0],
[6, 0, 2, 0, 0, 0, 0, 1, 0],
[0, 3, 8, 0, 0, 6, 0, 4, 7],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 9, 0, 0, 0, 0, 0, 7, 8],
[7, 0, 3, 4, 0, 0, 5, 6, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]];
if SolveSudoku(Puzzle) then
Writeln(Puzzle)
else
Writeln('No Solution');
end.