program ex01;
var
max,min,n,num,i,j:integer;
a:array [1..100,1..100] of integer;
begin
readln(n);
num:=(n+1) div 2;
max:=n;min:=1;
for i:=num downto 1 do
begin
for j:=min to max do
begin
a[min,j]:=i;
a[j,min]:=i;
a[max,j]:=i;
a[j,max]:=i;
end;
inc(min);dec(max);
end;
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]);
writeln;
end;
end.
测试通过,希望采纳 ,效率比楼上的高,也比较好懂,而且应你的要求使用了二维数组
var
n,i,j,k:longint;
begin
readln(n);
n:=n div 2;
for i:=1 to n*2+1 do
for j:=1 to n*2+1 do begin
if abs(j-n-1)>abs(i-n-1) then k:=abs(j-n-1) else k:=abs(i-n-1);
inc(k);
if j=n*2+1 then writeln(k) else write(k,' ');
end;
end.
代码有点丑= =是改进了一下以前的程序 也许你看不懂= =
虽然我知道最终肯定是2L那个最佳答案了,但是我还是很想贴一下我的代码,我的目的只有一个,就是希望说明做题的时候多用点数学方式去思考是有好处的,这样的程序会很巧妙.
uses math;
var x,y,n:longint;
function max(a,b:longint):longint;
begin
if(a>b)then exit(a);
exit(b);
end;
function f(x,y,aimx,aimy:longint):longint;
begin
exit(max(abs(x-aimx),abs(y-aimy))+1);
end;
begin
readln(n);
for x:=1 to n do begin
for y:=1 to n do begin
write(f(x,y,ceil(n/2),ceil(n/2)),' ');
end;
writeln;
end;
end.