Java代码实现打印螺旋矩阵

一个N阶矩阵顺时针呈螺旋状,形如下面的矩阵:

思路:使用一个二维数组存放数据,数组初始化为0,数组共有n平方个元素,因为是从1开始,所以元素的值是从1到n×n。按照上面的路线从1开始遍历一遍填入数据,每填入一个数据时后,判断边界和方向(说明,任意长度和宽度都可以使用这个思路,本例使用N*N的矩阵说明)。直接上代码了:

package study.haishen.com;

/**
 * @author Administrator
 *
 */
public class SpiralMatrix {
	
	/**
	 * @param n n阶
	 * @return 
	 */
	public int[][] createMatrix(int n)
	{
		int[][] matrix = new int[n][n];//n*n的二维数组,初始元素值都为0
		int right = 1, down = 2, left = 3, up = 4;//分别表示右下左上四个方向
		int direction = right;
		
		int numb = n * n;//n阶矩阵,共有n×n个数
		int i = 0, j = 0;
		for (int p = 1; p <= numb; p++)
		{
			matrix[i][j] = p;
			//判断方向向右的情况
			if(direction == right)
			{
				//如果当前位置的右面位置在右边界内且值还是初始值,则行不变,列号向右移动一位
				if (j + 1 < n && matrix[i][j + 1] == 0)
				{
					j++;
				} else {//如果超出右边边界,或者右面的元素已经被修改过,则向下移动一行,且将方向改为向下
					i++;
					direction = down;
					continue;
				}
			}
			//判断方向向下的情况
			if (direction == down)
			{
				//如果当前位置的下面位置在下边界内且值还是初始值,则列不变,行号向下移动一位
				if (i + 1 < n && matrix[i + 1][j] == 0)
				{
					i++;
				} else {//如果超出下边界,或者下面的元素已经被修改过,则向左移动一行,且将方向改为向左
					j--;
					direction = left;
					continue;
				}
			}
			//判断方向向左的情况
			if (direction == left)
			{
				//如果当前位置的左面位置在左边界内且值还是初始值,则行不变,列号向左移动一位
				if (j - 1 >= 0 && matrix[i][j - 1] == 0)
				{
					j--;
				} else {//如果超出左边界,或者左面的元素已经被修改过,则向上移动一行,且将方向改为向上
					i--;
					direction = up;
					continue;
				}
			}
			//判断方向向上的情况
			if (direction == up)
			{
				//如果当前位置的上面位置在上边界内且值还是初始值,则列不变,行号向左移动一位
				if (i - 1 >= 0 && matrix[i - 1][j] == 0)
				{
					i--;
				} else {//如果超出上边界,或者上面的元素已经被修改过,则向右移动一列,且将方向改为向右
					j++;
					direction = right;
					continue;
				}
			}
		}
		return matrix;
	}
	
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		int n = 10;
		SpiralMatrix s = new SpiralMatrix();
		int[][] data = s.createMatrix(n);
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				System.out.print(data[i][j] + " ");
			}
			System.out.println();
		}
	}
}

运行结果:




猜你喜欢

转载自blog.csdn.net/huhaishen/article/details/80629747