A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ZZT 中级黑马   /  2016-5-12 09:36  /  1273 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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);   //递归调用
                    }
            }

}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马