题解 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.