奇数阶魔阵
【问题描述】魔阵是用自然数1,2,3…,n2填n阶方阵的各个元素位置,使方阵的每行的元素之和、每列元素之和及主对角线元素之和均相等。奇数阶魔阵的一个算法是将自然数数列从方阵的中间一行最后一个位置排起,每次总是向右下角排(即Aij的下一个是i+1,j+1)。但若遇以下四种情形,则应修正排数法。
(1) 列排完(即j=n+1时),则转排第一列;
(2) 行排完(即i=n+1时),则转排第一行;
(3) 对An,n的下一个总是An,n-1;
(4) 若Aij已排进一个自然数,则排Ai-1,j-2。
例如3阶方阵,则按上述算法可排成:
4 3 8
9 5 1
2 7 6
【参考程序】:
var
a : array[1..99,1..99]of integer;
i,j,k,n : integer;
begin
fillchar(a,sizeof(a),0);
write('n=');readln(n);
i:=n div 2+1;
j:=n;
a[i,j]:=1;
for k:=2 to n*n do
begin
if (i=n)and(j=n) then
j:=j-1
else
begin
i:=i mod n +1;
j:=j mod n +1;
end;
if a[i,j]<>0 then
begin
i:=i-1;
j:=j-2;
end;
a[i,j]:=k;
end;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:5);
writeln;
end;
end.