Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
125
Task/Sudoku/Delphi/sudoku-1.delphi
Normal file
125
Task/Sudoku/Delphi/sudoku-1.delphi
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
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;
|
||||
18
Task/Sudoku/Delphi/sudoku-2.delphi
Normal file
18
Task/Sudoku/Delphi/sudoku-2.delphi
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
var
|
||||
SudokuSolver: TSudokuSolver;
|
||||
begin
|
||||
SudokuSolver := TSudokuSolver.Create('850002400' +
|
||||
'720000009' +
|
||||
'004000000' +
|
||||
'000107002' +
|
||||
'305000900' +
|
||||
'040000000' +
|
||||
'000080070' +
|
||||
'017000000' +
|
||||
'000036040');
|
||||
try
|
||||
SudokuSolver.Solve;
|
||||
finally
|
||||
FreeAndNil(SudokuSolver);
|
||||
end;
|
||||
end;
|
||||
Loading…
Add table
Add a link
Reference in a new issue