2006年12月24日日曜日

数独◎终结者

作者:georgebush

内容摘要 README 使用方法: STEP One:在文本文档中 写入81个数(待填的用0表示,每九个换行,美两个数之间空一个) 保存为 input.in(主意后缀) 运行 “数独终结者” 文件夹内会生成一个Answer.out的文件,用文本打开,便是答案 (bestshudu.pas是源程序(pascal)) 特别注意:请不要输入过于“松弛“的数据,终结者会算出所有的解答。 作者 : 刘仲林 学校:上外附中 高一(二)班 联系方式: QQ:610179465 MSN:lzl901030@126.com

type
tmap=array[1..81] of byte;
Const
sort:array[1..9,1..9] of integer=(( 1,2,3,10,11,12,19,20,21),
( 4,5,6,13,14,15,22,23,24),
( 7,8,9,16,17,18,25,26,27),
(28,29,30,37,38,39,46,47,48),
(31,32,33,40,41,42,49,50,51),
(34,35,36,43,44,45,52,53,54),
(55,56,57,64,65,66,73,74,75),
(58,59,60,67,68,69,76,77,78),
(61,62,63,70,71,72,79,80,81));
var
i,j:integer;
map:tmap;
Procedure print;
var i,j:integer;
begin
for i:=1 to 81 do begin
write(map[i]:2);
if i mod 9=0 then writeln;
end;
writeln;
readln;
ENd;
Procedure try(x:integer);
var i,j,k,l:integer;
t:tmap;
b:array[0..9] of boolean;
begin
if x>81 then begin
print;
exit;
end;
fillchar(b,sizeof(b),false);
if map[x]<>0 then b[1]:=true;
if map[x]=0 then begin
for j:=1 to 9 do b[j]:=true;
{check rows}
for j:=1 to 81 do
if (j mod 9=x mod 9) then b[map[j]]:=false;
{check blocks}
for l:=1 to 9 do
for j:=1 to 9 do
if sort[l,j]=x then begin
for k:=1 to 9 do b[map[sort[l,k]]]:=false;
break;
end;
{Check lines}
l:=x mod 9;
if l=0 then l:=9;
for j:=1 to l-1 do
b[map[x-j]]:=false;
for j:=1 to 9-l do
b[map[x+j]]:=false;

end;
for i:=1 to 9 do
if b[i] then begin
t:=map;
if map[x]=0 then map[x]:=i;
try(x+1);
map:=t;
end;
End;
begin
assign(input,'input.in');reset(input);
assign(output,'Answers.out');rewrite(output);
writeln('^.^ 数独立终结者 ^.^ ');
for i:=1 to 81 do begin
if i mod 9 =0 then readln(map[i]) else read(map[i]);
end;
try(1);
writeln('作者 : 刘仲林');
writeln(‘学校:上外附中 高一(二)班’);
writeln('联系方式: ');
writeln('QQ:610179465');
writeln('MSN:lzl901030@126.com');
close(input);close(output);
readln;
End.

0 件のコメント: