写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
从昨天下午开始做题,一下午做出来9道,然后就剩这一个题。今天又做了一下午,终于把这最后一道做出来了
* 思路是这样的:
* 把打印结果看成大圈套小圈
* n=2打印1圈,n=3打印2圈,n=4打印两圈,n=5打印3圈,一共(n+1)/2圈------------->这是最外层的for循环,从0到(n+1)/2
* 一圈分四次打印:
* 第一次从左往右打印最上面一排,第二次从上往下打印最右边一排去掉最上面一个和最下面一个
* 第三次从右往左打印最下面一排,第四次从下往上打印最左边一排,去掉最下面一个和最上面一个
* 打印完一圈再往里打印第二圈知道打印完为止
* 矩阵分两种:
*一种中间有一个数
*一种中间是一个圈
* 如果矩阵之间只有一个数,比如5的矩阵,它的停止条件是num==n*n+1
* 矩阵中间是一个圈,停止条件看m
package com.itheima.test9;
public class Test9 {
public static void main(String[] args) {
int[][] a=myMethod(5);
for(int i=0;i<a.length;i++){
for(int j=0;j<a.length;j++){
switch ((a[i][j]+"").length()) {
case 1:
System.out.print(a[i][j]+" ");
break;
case 2:
System.out.print(a[i][j]+" ");
break;
case 3:
System.out.print(a[i][j]+" ");
break;
}
}
System.out.println();
}
}
public static int[][] myMethod(int n){
//初始化用来存放n阶矩阵的数组
int[][] a=new int[n][n];
//定义计数器从1开始
int num=1;
//这个m是第几个圈的意思
mark: for(int m=0;m<(n+1)/2;m++){
//从左往右打印最上面一排
for(int i=m;i<=n-1-m;i++){
a[m][i]=num++;
if(num==n*n+1)
break mark;
}
//从上往下打印最右边一排去掉最上面一个和最下面一个
for(int j=1+m;j<=n-2-m;j++){
a[j][n-1-m]=num++;
}
//右往左打印最下面一排
for(int k=n-1-m;k>=m;k--){
a[n-1-m][k]=num++;
}
//从下往上打印最左边一排,去掉最下面一个和最上面一个
for(int l=n-2-m;l>=1+m;l--){
a[l][m]=num++;
}
}
return a;
}
}