русский
Germany.ruForen → Архив Досок→ Programmierung

"Sudoku" - Алгоритм

22.04.06 22:14
Re: "Sudoku" - Алгоритм
 
boogyman прохожий
boogyman
in Antwort sl. 13.03.06 11:21
Алгоритм решения задачи (текст программы на языке Pascal):
program sudoku;
type
digit = set of 0..9;
operation = record
i:byte;
j:byte;
k:byte;
end;
var
a:array[1..9,1..9] of byte;
b:array[1..9,1..9] of digit;
i,j,k,t,nop:byte;
found:boolean;
s:digit;
f:text;
st:string;
o:operation;
count:integer;
procedure put(o:operation);
var
k,t:byte;
begin
a[o.i,o.j]:=o.k;
for k:=1 to 9 do begin
b[o.i,k]:=b[o.i,k]-[o.k];
b[k,o.j]:=b[k,o.j]-[o.k];
end;
for k:=(3*((o.i-1) div 3) + 1) to (3*((o.i-1) div 3) + 3) do
for t:=(3*((o.j-1) div 3) + 1) to (3*((o.j-1) div 3) + 3) do
b[k,t]:=b[k,t]-[o.k];
b[o.i,o.j]:=[o.k];
end;
begin
writeln('Enter filename: ');
readln(st);
assign(f,st);
reset(f);
{Ввод матрицы}
for i:=1 to 9 do
for j:=1 to 9 do read(f,a[i,j]);
close(f);

for i:=1 to 9 do
for j:=1 to 9 do begin
if a[i,j]=0 then begin
s:=[1..9];
for k:=1 to 9 do begin
s:=s-[a[i,k]];
s:=s-[a[k,j]];
end;
for k:=(3*((i-1) div 3) + 1) to (3*((i-1) div 3) + 3) do
for t:=(3*((j-1) div 3) + 1) to (3*((j-1) div 3) + 3) do
s:=s-[a[k,t]];
b[i,j]:=s;
end
else b[i,j]:=[a[i,j]];
end;
repeat
count:=0;
found:=true;
for i:=1 to 9 do
for j:=1 to 9 do begin
if a[i,j]=0 then begin
t:=0;
o.i:=i; o.j:=j;
for k:=1 to 9 do
if k in b[i,j] then begin
t:=t+1;
o.k:=k;
end;
if t=1 then begin
found:=false;
put(o);
end;
end;
end;
count:=count+1;
until found or (count>100);
{Вывод матрицы}
assign(f,'2'+st);
rewrite(f);
for i:=1 to 9 do begin
for j:=1 to 9 do write(f,a[i,j],' ');
writeln(f);
end;
close(f);
end.

Головоломки, логические игры в группе Denken und spielen!
 

Sprung zu