package com.itheima;
import java.util.Scanner;
/**
* 7、写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
1 2 3 4 ?
12 13 14 5
11 16 15 6
10 9 8 7
* @author hasee
*/
/**
* 思路:1.等长的二维数组,最大色数据是n*n
* 2.先打印最外面一圈
* 3.根据i,j变化,进入第二圈,依次循环
* 编程过程:按照以上思路,先将最外层添加完毕,再修改每行,每列的截至条件
* @author hasee
*
*/
public class Test7 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入行数:");
int hang=sc.nextInt(); //行数
int lie=hang; //因为是等长,所以行,列相同
int num=1; //要添加的数据,最小值是1(即初始化值为1)
int i=0; //代表行的初始化值为0,代表二维数组元素索引,最大为hang-1
int j=0; //代表列的初始化值为0,代表二维数组里面一维数组元素索引,最大为lie-1即hang-1
//定义二维数组
int arr[][]=new int[hang][lie];
while (num<=hang*lie) { //循环的条件是:要添加的数据num<=最大值hang*lie
/**
* 第一次循环打印的是最外圈添加的数据,把每一圈作为一次完整的循环
* 当j=i=0时,打印外圈上面的一行,从左往右添加数据,数据num从初始值1开始递加即num++
* 第一个元素开始开始j=i即arr[0][0]=1,后面的是arr[0][1],arr[0][2]....;
* 此后最后一个元素的条件j<hang-1即arr[0][hang-1]例如行数为5的第一行最后一个元素为arr[0][4]
*/
for (j=i; j<hang-i; j++) {
arr[i][j]=num++;
}
/**
*每一圈的最右边一列,从上到下添加数据,数据num也是递加的而且是从arr[0][hang-1]的基础上开始的num++
*那么这一列数据第一个元素值已经有了,第二个元素在第二行则i+1,即i++,且i++<lie=hang=j+1
*那么这一列元素为arr[1][hang-1],arr[2][hang-1]...i最大为hang-1
*最后一个元素为arr[hang-1][hang-1]例如行数为5的数组这一列最后一个元素为arr[4][4]
*/
j--;
i++;
for (; i<j+1; i++) {
arr[i][j]=num++;
}
/**
* 每一圈最下面的一行,从右往左添加元素而添加的元素,是在本行最后一个元素arr[hang-1][hang-1]基础上递加的num++
* 那么这一行的元素为从右往左arr[hang-1][hang-1],arr[hang-1][hang-1-1]...arr[hang-1][0]即i-1,j--且j>=hang-1-i
*/
i--;
j--;
for(;j>=hang-1-i;j--){
arr[i][j]=num++;
}
/**
* 每一圈最左边一列,从下往上添加元素,是在本列最后一个元素arr[hang-1][0]的基础上递加的num++,
* 而第一个元素已经添加过了即arr[0][0]=1,所以添加的时候截止到第二个
* 从下往上列不变,而行数逐步递减i--即arr[hang-1][0],arr[hang-2][0]...arr[hang-hang+1][0]即i>=j+1
*/
j++;
i--;
for(;i>=j+1;i--){
arr[i][j]=num++;
}
/**
* 这一圈循环结束后,要为下一圈循环做准备
* 行加1即i++,列加1即j++
*/
i++;
j++;
}
printArray(arr);
}
public static void printArray(int[][] arr){
/**
* for循环嵌套打印
* 行i<arr.length
* 列j<arr[i].length
*/
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
}
|
|