您的位置:首页 > 其它

【顺时针打印矩阵】

2014-04-08 20:09 295 查看
 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:               

 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

;
//定义计数器从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;
}
}






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: