题解 P2615 【神奇的幻方】
本人蒟蒻,此题为模拟。
var n,i,j,x1:longint;x,y:array[0..2000] of longint;a:array[0..40,0..40] of longint;
begin
readln(n);
fillchar(a,sizeof(a),0);
a[1,(n div 2)+1]:=1;x[1]:=1;y[1]:=(n div 2)+1;//一步一步,设置1的位置。
for i:=0 to n+1 do
for j:=0 to n+1 do
if (i=0) or (j=0) or (i=n+1) or (j=n+1) then a[i,j]:=1;//防止越界
for i:=2 to n*n do//n*n的幻方
begin
if (x[i-1]=1) and (y[i-1]<>n) then begin x[i]:=n;y[i]:=y[i-1]+1;a[x[i],y[i]]:=i;end;
if (x[i-1]<>1) and (y[i-1]=n) then begin x[i]:=x[i-1]-1;y[i]:=1;a[x[i],y[i]]:=i;end;
if (x[i-1]=1) and (y[i-1]=n) then begin x[i]:=x[i-1]+1;y[i]:=y[i-1];a[x[i],y[i]]:=i;end;
if (x[i-1]<>1) and (y[i-1]<>n) then begin
if a[x[i-1]-1,y[i-1]+1]=0 then begin x[i]:=x[i-1]-1;y[i]:=y[i-1]+1;a[x[i],y[i]]:=i;end
else begin x[i]:=x[i-1]+1;y[i]:=y[i-1];a[x[i],y[i]]:=i;end;
end;
end;//模拟
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln;
end;输出
end.