如下图
当我们遇到一个复杂问题时可以用图像帮我们思考
在上图中,我们设置二维数组宽度为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