[二维数组]-顺时针螺旋打印二维数组

如下图

[二维数组]-顺时针螺旋打印二维数组_第1张图片

 当我们遇到一个复杂问题时可以用图像帮我们思考

在上图中,我们设置二维数组宽度为rows,高度为columns,取左上角坐标为(startX,startY),取左下角的坐标为(endX,endY),可以发现

每次循环的开始为(startX,startY),endX和endY可以根据rows和columns来推出,所以我们应该去发现(startX,startY)的规律

我们来分析循环结束的条件。

对一个rows为2,columns为2的二维数组,最后一次打印startX = 0、startY= 0。

对一个rows为3,columns为3的二维数组,最后一次打印startX = 1、startY= 1。

对一个rows为4,columns为4的二维数组,最后一次打印startX = 1、startY= 1。

对一个rows为5,columns为5的二维数组,最后一次打印startX = 2、startY= 2。

对一个rows为6,columns为6的二维数组,最后一次打印startX = 2、startY= 2。

我们可以得出 让循环继续的条件为

startX * 2 < rows && startY * 2 < columns

这些条件我们大概可以把循环体定下来了


接下来我们来分析循环体中的顺时针打印


// 第一步,从左到右打印一行
PrintRowIncreasingly

// 第二步,从上到下打印一列
printColumnIncreasingly

// 第三步,从右到左打印一行
printRowDecreasingly

// 第四步,从下到上打印一列

printColumnDecreasingly

该传那些参数,判断执行的条件,具体如下

/*
 * 如以下矩阵
 * 输入 4 4
 * 初始化为
 *  1   2   3   4
 *  5   6   7   8
 *  9  10  11  12
 * 13  14  15  16
 * 则依次输出1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10
 * 
 * 类似的
 * 输入2 3
 * 初始化为
 *  1   2   3
 *  4   5   6
 *  依次输出1,2,3,6,5,4
 * 输入3 2
 * 初始化为
 * 	1   2
 *  3   4
 *  5   6
 *  依次输出1,2,4,6,5,3
 */
public class HelixMatrix01 {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		int m = scan.nextInt();
		int arr[][] = new int[n][m];
		initArr(arr);
		printArr(arr);
	}

	private static void printArr(int arr[][]) {
		int startX = 0;
		int startY = 0;
		int endX = 0;
		int endY = 0;
		int rows = arr.length;
		int columns = arr[0].length;
		while (startX * 2 < rows && startY * 2 < columns) {
			endX = arr[0].length - 1 - startX;
			endY = arr.length - 1 - startY;
			// 第一步,从左到右打印一行
			PrintRowIncreasingly(arr, startX, endX, startY);
			// 第二步,从上到下打印一列
			if (startY < endY) {    	//当剩余行数多于或等于两行时
				printColumnIncreasingly(arr, endX, startY + 1, endY);
			}
			// 第三步,从右到左打印一行
			if(endX>startX){			//当剩余列数多余或等于两行时
				printRowDecreasingly(arr, endX - 1, startX, endY);
			}
			// 第四步,从下到上打印一列
			if(endY-1 > startY)
			printColumnDecreasingly(arr, startX, endY-1, startY + 1);
			startX++;
			startY++;
		}
	}

	private static void PrintRowIncreasingly(int arr[][], int startX, int endX, int startY) {
		for (int i = startX; i <= endX; ++i) {
			System.out.print(arr[startY][i] + " ");
		}
	}
	private static void printColumnIncreasingly(int arr[][], int endX, int startY, int endY) {
		for (int j = startY; j <= endY; ++j) {
			System.out.print(arr[j][endX] + " ");
		}
	}
	private static void printRowDecreasingly(int arr[][], int startX, int endX, int endY) {
		for (int i = startX; i >= endX; --i) {
			System.out.print(arr[endY][i] + " ");
		}
	}
	private static void printColumnDecreasingly(int arr[][], int startX, int startY, int endY) {
		for (int j = startY; j >= endY; --j) {
			System.out.print(arr[j][startX] + " ");
		}
	}

	private static void initArr(int arr[][]) {
		int temp = 1;
		for (int i = 0; i < arr.length; ++i) {
			for (int j = 0; j < arr[0].length; ++j) {
				arr[i][j] = temp++;
			}
		}
//		for(int i=0; i



对一个rows为3,columns为3的二维数组,最后一次打印startX = 1、startY= 1。

你可能感兴趣的:(数据结构)