矩阵螺旋输出

注:本问题出自http://www.cnblogs.com/pangxiaoliang/archive/2009/07/24/1530084.html

今天在博客园首页看到了这样一个算法题:

方正公司的面试上机题——N×N矩阵螺旋打印输出,如下:

例:

1 2 3

4 5 6 

7 8 9

输出为如下结果

1;4;7;8;9;6;3;2;5;


简单写了一个算法,读起来可能有些别扭哈,忘同仁海涵,提出意见:

设矩阵为L[N,N] ,输出方向的旋转方向可能为ClockwiseAnti-Clockwise

设当前的位置(Current Location)CL[i,j],下步预期位置(Next Location)NL[p,q].

 

可设一个循环列表来表征输出方向的特征向量D,其第k项记为D(k),其中包含2维数据,分别记为D(k).iD(k).j,根据旋转方向D可以分别定义为:

         DAnti-Clockwise{Down(1,0),Right(0,1),Up(-1,0),Left(0,-1)}

    Dclockwise    {Right(0,1),Down(1,0),Left(0,-1),Up(-1,0)}

同时,仍需定义一个方法判断某位置是否越界或者之前已经路过,设为 bool isValidLocation(L[i,j]),为了辅助判断之前的已经过的路径,需要设置一个辅助向量来记录之前经过路径在发生转向时的位置,设为A(4),其中A(k)中包含2维数据,记为A(k).iA(k).j分别对应该位置的坐标。

 

1.设初始位置(Initial Location)CL[i,j]旋转方向为R,初始输出方向为Direction,退出标志变量Flagfalse

2.输出CL[i,j]位置及其值。

3.根据R选择某一个特征向量D,根据DirectionD中查找当前的输出方向的下标k,对应的方向向量设为D(k)。并利用i,j,k初始化辅助向量A的第kA(k)

4.按照输出方向的特征向量D(k)变化CL的位置,则下步预期位置NL[p,q],p=i+D(k).i,q=j+D(k).j

5.通过方法isValidLocation(NL[p,q],k)判断下步预期位置NL[p,q]是否越界或者之前已经路过:

如果判断为真,则改变当前位置CL[i,j]=NL[p,q]。设置Flagfalse,重复第2-5步。

如果判断为假,且Flagfalse,则改变下标k(k+1)%4,(注:则其对应输出方向D(k)D((k+1)%4),设置Flagtrue,重复第4-5步。

如果判断为假,且Flagtrue,则跳出循环,程序结束。

 

判断某位置是否越界或者之前已经路过的方法bool isValidLocation(L[i,j],k)基本流程:

//判断越界

1.如果i>=N i<0,i越界,利用i,j,k,记录A(k),返回false

2.如果j>=N j<0,j越界,利用i,j,k,记录A(k),返回false

//判断是否经过

3.如果A((k+1)%4).i == A((k+2)%4).i ,则判断 i == A((k+1)%4).i

如果为真,则利用i,j,k,记录A(k)返回 false

如果为假,返回 true

4.如果A((k+1)%4).j == A((k+2)%4).j ,则判断 j == A((k+1)%4).j

如果为真,则利用i,j,k,记录A(k)返回 false

如果为假,返回 true

5.返回 true.

posted @ 2009-07-24 15:31  wangyile  阅读(3781)  评论(5编辑  收藏  举报