a druha vec, ci by nebol niekto ochotny mi tento program nejak vysvetlit
Kód: Vybrať všetko
type
TSudoku = class
Pole: array [0..8, 0..8] of integer;
Opakuje: array [0..8, 0..8] of Boolean;
Stlpec: array [0..8] of set of 1..9;
Riadok: array [0..8] of set of 1..9;
Malystvorec: array [0..2, 0..2] of set of 1..9;
constructor Create( Memo1:TMemo );
procedure Vyplnsudoku;
procedure Backtracking;
function Moze(r,s, k: integer): Boolean;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Sudoku: TSudoku;
begin
Sudoku := TSudoku.Create( Memo1 );
Sudoku.Backtracking;
end;
constructor TSudoku.Create( Memo1:TMemo );
var
sudokutext: TextFile;
r,s: integer;
begin
AssignFile(sudokutext, 'sudoku.txt');
Reset(sudokutext);
for r := 0 to 8 do
for s := 0 to 8 do
begin
Read(sudokutext, Pole[r,s]);
Opakuje[r,s] := Pole[r,s] <> 0;
if Opakuje[r,s] then
begin
Stlpec[s] := Stlpec[s] + [Pole[r,s]];
Riadok[r] := Riadok[r] + [Pole[r,s]];
Malystvorec[r div 3, s div 3] := Malystvorec[r div 3, s div 3] + [Pole[r,s]];
end;
end;
CloseFile(sudokutext);
Vyplnsudoku;
end;
procedure TSudoku.Vyplnsudoku;
var
r,s: integer;
begin
Form1.Memo1.Clear;
for r := 0 to 8 do begin
for s := 0 to 8 do
Form1.Memo1.Text := Form1.Memo1.Text + ' ' + intToStr( Pole[r,s] );
Form1.Memo1.Text := Form1.Memo1.Text + #13#10;
end;
Form1.Memo1.Lines.Add( ' ' );
end;
function TSudoku.Moze(r,s, k: integer): Boolean;
begin
Result := not (k in Riadok[r]) and
not (k in Stlpec[s]) and
not (k in Malystvorec[r div 3, s div 3]);
end;
procedure TSudoku.Backtracking;
var
r,s,k: integer;
begin
r := 0;
s := 0;
while (r < 9) and (Pole[r,s] <> 0) do
begin
inc(s);
if s = 9 then
begin
inc(r);
s := 0;
end;
end;
if r = 9 then
begin
Vyplnsudoku;
end
else
for k := 1 to 9 do
if Moze(r,s, k) then
begin
Pole[r,s] := k;
Stlpec[s] := Stlpec[s] + [k];
Riadok[r] := Riadok[r] + [k];
Malystvorec[r div 3, s div 3] := Malystvorec[r div 3, s div 3] + [k];
Backtracking;
Pole[r,s] := 0;
Stlpec[s] := Stlpec[s] - [k];
Riadok[r] := Riadok[r] - [k];
Malystvorec[r div 3, s div 3] := Malystvorec[r div 3, s div 3] - [k];
end;
end;
end.