博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

方阵填数

Posted on 2010-10-19 21:22  桃子在路上  阅读(1465)  评论(0编辑  收藏  举报

方阵填数1

【题目】方阵填数:在一个N×N的方阵中,填入1,2,.....N×N个数,并要求构成如下的格式:

如 N=4           N=5

10 11 12 1      13 14 15 16 1

9 16 13 2       12 23 24 17 2

8 15 14 3       11 22 25 18 3

7 6  5  4        10 21 20 19 4

                     9  8    7  6  5

 

【参考程序】

Var

j:Integer;

n,i,k,x,y,Number:Byte;

Result:Array[1..25,1..25] of Byte;

Begin

Write('N='); Readln(n);

For x:=1 to n do for y:=1 to n do Result[x,y]:=0; {初始化数组}

X:=0; Y:=N; i:=0; k:=N; j:=1;

{j表示填数方向。从左→右或从上→下,j=1;否则j=-1}

While i<N*N do

Begin

For i:=i+1 to i+k do {纵向填 k 个数}

Begin

X:=X+j;

Result[x,y]:=i;

End;

Dec(k); {K:填多少个数,其规律是递减:n,n-1,n-2,......,2,1}

If j=1 then j:=-1 else j:=1; {改变方向}

For i:=i+1 to i+k do {横向填 k 个数}

Begin

y:=y+j;

Result[x,y]:=i;

End;

End;

For x:=1 to n do {输出}

Begin

For y:=1 to n do Write(Result[x,y]:3);

Writeln;

End;

End.


方阵填数2

【题目】方阵填数:在一个N×N的方阵中,填入1,2,.....N×N个数,并要求构成如下的格式:

N=4             N=5

1 3 4 10       1 3 4 10 11

2 5 9 11       2 5 9 12 19

6 8 12 15     6 8 13 18 20

7 13 14 16    7 14 17 21 24

                   15 16 22 23 25

【算法分析】

例如N=4,观察图案,是以右上→左下,或左下→右上 这样的斜向来填数的。

1 2 3 4 这个方向可用 j 取1与-1 来控制。

/ / / / 3 一共有7个斜行,每一斜行数的个数的规律 1,2,3,4,3,2,1

/ / / / 2 例如第三斜行,其坐标变化规律:a[1,3]->a[2,2]->a[3,1]

/ / / / 1 第四斜行,a[4,1]->a[3,2]->a[2,3]->a[1,4]

/ / / / 坐标变化规律均是:在上一坐标基础上加1或减1

【参考程序】

var a:array[1..20,1..20]of integer;

n,x,y,i,j,k,ii:integer;

begin

writeln('input n:');readln(n); {输入N}

fillchar(a,sizeof(a),0);

i:=0;x:=1;y:=1;k:=1;j:=1; {i:第i个数;x,y:坐标;k:每一斜行循环填的次数}

{j:方向,由右上→左下,j=1;由左下→右上,j=-1}

while i<>n*n do begin {未填完}

for ii:=1 to k do begin {每一斜行要填k个数}

if ii>1 then begin x:=x+j; y:=y-j;end; {斜行的头一个数,坐标不变}

{其他的要在原基础上根据方向 j 改动}

inc(i); { i 存放填的数字}

a[x,y]:=i; {填于数组相应位置}

end;

{以下确定下一斜行的首坐标,填多少个数K(即循环次数K),方向 j 取反}

if j=-1 then inc(y) else inc(x); {根据上一斜行确定下一斜行的起始坐标}

j:=-j; {方向取反}

if y>n then begin y:=n;x:=x+1;end; {调整坐标,使之不出界}

if x>n then begin x:=n;y:=y+1;end;

if x+y<=n+1 then inc(k) else dec(k); {确定下一斜行要填多少个数}

end;

for i:=1 to n do begin for j:=1 to n do write(a[i,j]:4);writeln;end;{输出}

end.