1996年12月第13卷第4期广西师院学报(自然科学版)JournalofGuangxiTeaehersColle罗(NaturalScieneeEdition)I戈e.1996Vo】.13,No.4n阶螺旋方阵的生成¹彭月英(广西师范学院计算中心,南宁,530001)摘典该文使用C语言编程,实现了对任意自然数n的n阶螺旋方阵的自动生成及打印。关扭词,阶方阵;”阶螺旋方阵;二维数纽,循环;N一S图1引言与间题所谓n阶螺旋方阵是指形如.巨fee二OJ,立由外向内一层一层生成的n阶方阵(此处n一7)。这类方阵在现代物理、计算方法及计算机图形学等学科中有着十分重要的应用。因此我们来讨论它的生成问题。一般方阵的打印在程序设计中是先定义一个二维数组,然后对此数组人为地初始化或逐个赋值,一个程序只能产生一个或固定几个具体的方阵。例如,对干以下的5阶螺施方阵9口八乙,1,.1吐占OJ11今自JJL人,.19曰
卜以口矛111.11乙八11()92肘8朴207l8l,56方阵可用如下初始化方法给二维数组元素赋值·兀收稿日期:1996一08一29广西师院学报(自然科学版)第13卷inta[5][5〕={{1,16,15,14,13},{2,17,24,23,12},{3,18,25,22,11},{4,19,20,21,10},{5,6,7,8,9}};然后用如下语句进行打印for(i=0;i<5;i++){for(j~o;j(5;j++)printf(“%4d,,a〔i][j]);printf(“/n,,);printf(“/n,,);}方阵1即可得到打印输出。而这样设计的程序没有通用性。只能打印这一个5阶螺旋方阵。若要打印6阶螺旋方阵,又要重新定义数组,且重新初始化.即人先要在纸上书写出这个6阶方阵,才能把数据写入程序中。当阶数很大时,工作量相当大。本文是想寻求使用一个程序,就能打印出用户需要的任何阶数的螺旋方阵,并且方阵的.元素值全部由程序根据阶数自动产生。为此,我们以5阶螺旋方阵为例,详细分析了该方阵的特点,总结推导出生成n阶螺旋方阵的一般规律。由此写出程序,每次运行时只要用户给出一个n的具体数值,该程序就能自动生成一个对应的螺旋方阵。假设n~5,则5阶螺方阵应按箭头方向如下生成OdO乙1刁.上甲自.l月队O口工,IC了‘,.占一乃夕‘l丹匕甲」t,.几一.几1110勺乙119n乙28{2519206789,l乃‘nJJL人尸O⋯.‘.叮.山方阵2此方阵对应的一般二维数组方阵设计如下J马孟,曰,La口02口oa己12口la..月弓,,da..,J月.J,目,da,‘,‘,目,da气上,.‘L.,山a如果要按箭头所示方向从外向内,要考虑如下三个间题:口41口42口毛3口4-方阵3一层一层给下标变量赋值,考虑到阶数n的任意性,故nU0nJC0,1几‘,J月,a.1...‘esl月月es.‘几.几we人甘(l)要找出层数k与阶数n的关系式,假定n由用户输入,k要在程序中根据n计算出来。(2)定义变量value=1,然后赋值时让它value++;第4期彭月英:,阶螺旋方阵的生成(3)要找出生成每层四条边的元素的下标变化的规律。为了解决这些间题,我们把方阵拆开来看,把方阵3的元素按箭头方向分成如下四个部分:、1)方阵左半边:垂直向下的三个箭头所示的三列元素;(2)方阵下半边:从左向右的水平箭头所示的两行元素;(3)方阵右半边:从下到上的竖箭头所示的两列元素;(4)方阵上半边:从右到左的水平箭头所示的两行元素。下面我们通过讨论如何给这四部分的元素赋值,来解决n阶螺旋方阵的赋值问题。2算法推出与程序设计假定n阶螺旋方阵有k层,每层由四边组成,则由方阵3看,层数k从。开始,先产生第o层,再产生第一层,然后产生第二层。5阶方阵只有3层,3~5+12,由此可推出n阶螺旋方阵有〔华〕层,*从。开始,故k<‘n+l2,由此想到设计一个外循环来控制产生的层数:for(k=0;k<(n+l)/2;k++)下面我们来看看方阵3左半边的列的元素(不妨设为al’)从外到内下标变化的规律:列下标S正好是层数k的值,它在产生一列元素时不变。行下标l在产生第一列时,从。变到4,在产生第二列时,从l变到3,在产生第三列时,从2变到2,故推导出产生n阶螺旋方阵左半边由外到内的列的循环结构为for(i=k;i