【问题描述】
幻方是一种很神奇的 N*N 矩阵:它由数字 1,2,3, … … , N*N 构成,且每行、每列及两条对角线上的数字之和都相同。
当N为奇数时,我们可以通过以下方法构建一个幻方:
首先将 1 写在第一行的中间。
之后,按如下方式从小到大依次填写每个数K(K= 2,3, … , N*N ):
1. 若 (K−1) 在第一行但不在最后一列,则将K填在最后一行,(K− 1) 所在列的右一列;
2. 若 (K− 1) 在最后一列但不在第一行,则将K填在第一列,(K− 1) 所在行的上一行;
3. 若 (K− 1) 在第一行最后一列,则将K填在 (K− 1) 的正下方;
var
t:array[1..39,1..39] of longint;
xx,x,yy,y,n,i,j:longint;
procedure p1;
begin
assign(input,'magic.in');
assign(output,'magic.out');
reset(input);
rewrite(output);
end;
procedure p2;
begin
close(input);
close(output);
end;
begin
p1;
read(n);
fillchar(t,sizeof(t),0);
x:=(n+1) shr 1;y:=1;t[x,y]:=1;
for i:=2 to n*n do begin
xx:=(x+n) mod n+1;
yy:=(y+n-2) mod n+1;
if t[xx,yy]<>0 then begin
xx:=x;
yy:=y+1;
end;
x:=xx;y:=yy;
t[x,y]:=i;
end;
for i:=1 to n do begin
for j:=1 to n-1 do write(t[j,i],' ');
writeln(t[n,i]);
end;
p2;
end.
4. 若 (K− 1) 既不在第一行,也不在最后一列,如果 (K− 1) 的右上方还未填数, 则将K填在(K− 1)的右上方,否则将K填在 (K− 1) 的正下方
现给定N,请按上述方法构造 N*N 的幻方。
----------------------------------------------------------------------------------------分割线----------------------------------------------------------------------------------
不废话,直接模拟