package com.itheima;
public class Test07 {
/**
*第七题: 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
*/
public static void main(String[] args) {
arrayNum(5);
}
//便于改代码..输入不同y值输出不同的二维数列
private static void arrayNum(int y)
{
int[][] arr=new int[y][y]; //定义二维数组
int n=arr.length; //一维数组的长度
int max=0;
int c=0;
specArr(arr,n,max,c);
arrPrint(arr);
}
//高级for输出打印用的
private static void arrPrint(int[][] h) {
for(int[] in:h) {
for(int t:in) {
if(t<10)System.out.print(" "+t+" ");
else System.out.print(t+" ");
}
System.out.println();
}
}
//利用递归,一层一层写进去..
private static void specArr(int[][] arr,int n,int max,int count) {
if(n>0){
int j=0;
for(int i=0;i<(n-1)*4;i++)
{
if (i<n-1) arr[0+count][i+count]=++max;
else if (i<2*n-2) arr[count+j++][arr.length-1-count]=++max;
else if (i<3*n-3) arr[arr.length-1-count][(j--)+count]=++max;
else if (i<4*n-4) arr[arr.length-1-(j++)-count][0+count]=++max;
}
if(n==1){arr[arr.length/2][arr.length/2]=max+1 ;}//注意到 当y值为奇数时,会有循环到n=1的情况,需要补进数组最中间值
count++;
n-=2;
specArr(arr,n,max,count); //递归调用
}
}
}
|
|