九宫格算法实现(Delphi版本)
发现用Delphi写出来的比用C写出来的计算快多了。
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, PerlRegEx, classes;
var
GG: array[0..8] of array[0..8] of Integer;
const
QQ:array[0..8] of integer=(0,0,0,3,3,3,6,6,6);
procedure SetGG;
var
f: TextFile;
n, m: Integer;
Reg: TPerlRegEx;
List: TStrings;
s: string;
begin
Reg:=TPerlRegEx.Create(nil);
List:=TStringList.Create;
s:=''; n:=0;
AssignFile(f,'data.txt');
Reset(f);
while not eof(f) do
begin
Readln(f,s); s:=trim(s);
if not (s='') then
begin
reg.Subject := s;
reg.RegEx := ' *';
reg.Split(list,MaxInt);
for m := 0 to 8 do
begin
GG[n,m]:=strtoint(list[m]);
end;
n:=n+1;
end;
list.Clear;
end;
list.Free;
closefile(f);
end;
procedure OutGG;
var
I: Integer;
j: Integer;
begin
for I := 0 to 9 - 1 do
for j := 0 to 9 - 1 do
if (j<>8) then Write(IntToStr(GG[i,j])+' ') else Writeln(GG[i,j]);
Readln(i);
end;
function IsValid(i,j:integer):boolean;
var n,t,u:integer;
begin
Result:=true;
n:=GG[i,j];
for t := 0 to 9 - 1 do
if(((t<>i) and (GG[t,j]=n)) or ((t<>j) and (GG[i,t]=n))) then result:=false;
for t := QQ[i] to QQ[i]+2 do
for u := QQ[j] to QQ[j] +2 do
if(((t<>i) or (u<>j)) and (GG[t,u]=n)) then result:=false;
end;
procedure calc(n:integer);
var i,j,k:integer;
begin
if(n=81) then
begin
OutGG;
Exit;
end;
i:=n div 9; j:=n mod 9;
if(GG[i,j]<>0) then
begin
calc(n+1);
exit;
end;
for k := 0 to 9 - 1 do
begin
GG[i,j]:=GG[i,j]+1;
if(IsValid(i,j)) then
begin
calc(n+1);
end;
end;
GG[i,j]:=0;
end;
begin
SetGG;
calc(0);
OutGG;
end.