Home > 面试 > 内螺旋矩阵

内螺旋矩阵

暂且就叫内螺旋矩阵吧。

int i=5;
1  2  3  4  5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

int i=6
1  2  3  4  5   6
20 21 22 23 24  7
19 32 33 34 25  8
18 31 36 35 26  9
17 30 29 28 27 10
16 15 14 13 12 11

最近常在网上看到一些打印矩阵的题,后来发现其实都是有相同的规律可循的:

1. 将问题转化为初始化矩阵的问题,然后模拟行走的方向,一般来说,方向都是循环的,而每次行走的步数也是按一定的规律递减,比如当i = 5 时:

向右 5 步
向下 4 步
向左 4 步
向上 3 步
向右 3 步
向下 2 步
向左 2 步
向上 1 步
向右 1 步

很明显吧?544332211,右下左上,右下左上…

2. 在编程时,我们可以用一个整数 direction 来记录方向,每到当前方向的最后一步,就转变方向。由于方向都是按一定的次序循环的,所以,在转换方向时,可以用:

direction = (direction+1)%4。

代码如下:

package org.leeing.matrix;

public class InnerCircle {
	public static void main(String[] args) {
		circle(5);
	}

	private static void circle(int num) {
		int matrix[][] = new int[num][num];
		int row = 0, column = 0;
		int direction = 1;
		int digit = 1;
		int round = 2 * num; 

		for (int i = round; i >= 2; i--) {

			for (int j = i / 2; j >= 1; j--) {
				if(j==1){
					direction = (direction + 1) % 4;
				}
				switch (direction) {
				case 0:
					matrix[row--][column] = digit++;
					break;
				case 1:
					matrix[row][column++] = digit++;
					break;
				case 2:
					matrix[row++][column] = digit++;
					break;
				case 3:
					matrix[row][column--] = digit++;
					break;

				}
			}

		}

		for (int i = 0; i < num; i++) {
			for (int j = 0; j < num; j++) {
				System.out.print(matrix[i][j] + "\t");
			}
			System.out.println();
		}
	}
}

是不是和之前的《三角螺旋矩阵》代码很相似呢?:)

Related posts:

  1. 三角螺旋矩阵
  2. 对称矩阵
  3. 蛇形矩阵
  4. PeerSim 源代码分析之一:程序入口
  5. Java 的引用传递
Categories: 面试 Tags:
  1. No comments yet.
  1. No trackbacks yet.