* 7、写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
*/
public class Test07 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //创建Scanner对象, 用于接收键盘录入的数组长度
System.out.println("请输入二维数组长度n的值: "); //提示用户输入
int n = sc.nextInt();
int[][] arr = new int[n][n]; //创建用键盘录入的长度值,创建二维数组
int now = 1; //设定初始值
int start = 0;
int end = n - 1;
while (true) { //开始为数组赋值
now = toRight(arr, start, end, now); //首先向右赋值,行值不变,列值递增, 达到末尾减1处停止
now = toDown(arr, start, end, now); //向下赋值, 列值为向右赋值的结尾固定不变, 从向右赋值开始位置递增, 进行向下赋值,达到末尾减1处停止
now = toLeft(arr, start, end, now); //向左赋值, 行值为向下赋值的结尾固定不变, 列值从向下赋值的结尾开始递减, 进行向左赋值, 达到末尾减1处停止
now = toUp(arr, start, end, now); //向上赋值, 列值为向左赋值的结尾固定不变, 行值从向左赋值结尾开始递减, 进行向上赋值, 达到末尾减1处停止
//至此完成一圈的赋值
start++; //将内部的未赋值数组看成新的二维数组, 只是行值和列值都增加1
end--;
if (start >= end) { //当start大于等于end时,说明已经完成所有赋值,就可以跳出循环了
break;
}
}
if (n % 2 == 1) { //由于长度为奇数的数组无法完成中心的赋值, 所以这里手动完成中心值的赋值操作
arr[n / 2][n / 2] = n * n;
}
System.out.println("数组打印如下");
show(arr); //打印数组
}
//向上赋值, 列值为向左赋值的结尾固定不变, 行值从向左赋值结尾开始递减, 进行向上赋值, 达到末尾减1处停止
public static int toUp(int[][] arr, int start, int end, int now) {
for (int i = end; i > start; i--) {
arr[i][start] = now;
now++;
}
//返回当前赋值进度
return now;
}
//向左赋值, 行值为向下赋值的结尾固定不变, 列值从向下赋值的结尾开始递减, 进行向左赋值, 达到末尾减1处停止
public static int toLeft(int[][] arr, int start, int end, int now) {
for (int i = end; i > start; i--) {
arr[end][i] = now;
now++;
}
//返回当前赋值进度
return now;
}
//向下赋值, 列值为向右赋值的结尾固定不变, 从向右赋值开始位置递增, 进行向下赋值,达到末尾减1处停止
public static int toDown(int[][] arr, int start, int end, int now) {
for (int i = start; i < end; i++) {
arr[i][end] = now;
now++;
}
//返回当前赋值进度
return now;
}
//首先向右赋值,行值不变,列值递增, 达到末尾减1处停止
public static int toRight(int[][] arr, int start, int end, int now) {
for (int i = start; i < end; i++) {
arr[start][i] = now;
now++;
}
//返回当前赋值进度
return now;
}
//打印数组
public static void show(int[][] arr) {
for (int[] is : arr) {
for (int i : is) {
System.out.print(i + "\t");
}
System.out.println();
}
}
} |