您的位置:首页 > 其它

矩阵螺旋输出

2009-07-24 15:31 429 查看
注:本问题出自/article/5904154.html

今天在博客园首页看到了这样一个算法题:
方正公司的面试上机题——N×N矩阵螺旋打印输出,如下:

例:

1 2 3

4 5 6

7 8 9

输出为如下结果

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

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

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

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

可设一个循环列表来表征输出方向的特征向量D,其第k项记为D(k),其中包含2维数据,分别记为D(k).i与D(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).i与A(k).j分别对应该位置的坐标。

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

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

3.根据R选择某一个特征向量D,根据Direction从D中查找当前的输出方向的下标k,对应的方向向量设为D(k)。并利用i,j,k初始化辅助向量A的第k项A(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]。设置Flag为false,重复第2-5步。

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

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



判断某位置是否越界或者之前已经路过的方法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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: