本帖最后由 209920266 于 2015-1-22 08:34 编辑
package com.itheima;
import java.util.Scanner;
public class Test11 {
public static void main(String[] args) {
System.out.println("请输入一个大于0的整数");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
print(num);
}
private static void print(int num) {
int[][] arr = new int[num][num];// 定义等长的二维数组。
int x = 0;// x控制横坐标
int y = 0;// y控制纵坐标
int n = arr.length;
int value = 0;
getArr(arr, x, y, n, value);
printArr(arr);// 执行打印
}
private static void printArr(int[][] arr) {
// 双重循环打印
for (int[] ar : arr) {// 外循环,遍历二维数组中的一维数组
for (int a : ar) {// 内循环,遍历一位数组中的每一个元素
System.out.print(a + "\t");
}
System.out.println();
}
}
private static void getArr(int[][] arr, int x, int y, int n, int value) {
if (n > 0) {
// (n-1)*4代表每一圈的数值范围
for (int i = 0; i < (n - 1) * 4; i++) {
if (i < n - 1) {// 上
arr[x][y] = ++value;
y++;
} else if (i < 2 * n - 2) {// 右
arr[x][y] = ++value;
x++;
} else if (i < 3 * n - 3) {// 下
arr[x][y] = ++value;
y--;
} else if (i < 4 * n - 4) {// 左
arr[x][y] = ++value;
x--;
}
}
// 通过上面的循环,x,y的值为此圈循环的起始坐标,下一圈的起始位置为x+1,y+1
n -= 2;// 边界每次减少2
x += 1;// 下一圈起始横坐标值
y += 1;// 下一圈起始纵坐标值
if (n == 1)// 特殊情况,最里圈只有一个值
arr[x][y] = value + 1;
getArr(arr, x, y, n, value);// 递归
}
}
}
|
|