矩阵螺旋输出
今天在博客园首页看到了这样一个算法题:
方正公司的面试上机题——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.