矩阵螺旋输出
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]是否越界或者之前已经路过:
判断某位置是否越界或者之前已经路过的方法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.
今天在博客园首页看到了这样一个算法题:
方正公司的面试上机题——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,则跳出循环,程序结束。
如果判断为假,且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.
相关文章推荐
- 【每日面试题】矩阵的螺旋输出
- Java实现输出回环数(螺旋矩阵)的方法示例
- 矩阵螺旋输出
- JavaScript输出螺旋矩阵
- 螺旋输出N*N矩阵
- (大神勿入)据说是一道面试题,然后自己就写了一发(矩阵的螺旋输出)
- 螺旋矩阵赋值或输出
- 输出双螺旋矩阵
- [LeetCode] Spiral Matrix 螺旋输出矩阵
- 矩阵顺时针螺旋输出2种不同的方法。
- JavaScript定义及输出螺旋矩阵的方法详解
- 矩阵顺时针螺旋输出2种不同的方法。
- 螺旋矩阵--由外向内旋转输出
- 螺旋输出二维矩阵
- C++编程循环输出螺旋矩阵
- java逆时针螺旋输出矩阵
- 输出螺旋矩阵(二)
- 螺旋输出N*N矩阵
- [算法]方正面试题:N×N矩阵螺旋打印输出
- C语言输出螺旋矩阵